2012-04-23 22 views
6

Câu hỏi này có liên quan đến this one, nhưng không trùng lặp. Jb đăng ở đó đó để thêm một thuộc tính tùy chỉnh, đoạn mã sau đây sẽ làm việc:Làm cách nào để thêm thuộc tính tùy chỉnh mà không có hàm tạo mặc định bằng cách sử dụng mono.cecil

ModuleDefinition module = ...; 
MethodDefinition targetMethod = ...; 
MethodReference attributeConstructor = module.Import(
    typeof(DebuggerHiddenAttribute).GetConstructor(Type.EmptyTypes)); 

targetMethod.CustomAttributes.Add(new CustomAttribute(attributeConstructor)); 
module.Write(...); 

Tôi muốn sử dụng một cái gì đó tương tự, nhưng thêm một thuộc tính tùy chỉnh mà constructor có hai tham số chuỗi trong (chỉ) constructor của nó, và tôi muốn chỉ định giá trị cho những người đó (hiển nhiên). Có ai giúp được không?

Trả lời

12

Trước tiên, bạn phải có được một tham chiếu đến đúng phiên bản của các nhà xây dựng:

MethodReference attributeConstructor = module.Import(
    typeof(MyAttribute).GetConstructor(new [] { typeof(string), typeof(string) })); 

Sau đó, bạn chỉ đơn giản là có thể di chuyển thuộc tính tuỳ chỉnh với các đối số chuỗi:

CustomAttribute attribute = new CustomAttribute(attributeConstructor); 
attribute.ConstructorArguments.Add(
     new CustomAttributeArgument(
      module.TypeSystem.String, "Foo")); 
attribute.ConstructorArguments.Add(
     new CustomAttributeArgument(
      module.TypeSystem.String, "Bar")); 
+0

nhanh hơn bao giờ hết Jb - cảm ơn rất nhiều cho sự giúp đỡ. Quá nhanh để tôi chấp nhận câu trả lời, tôi sẽ làm trong vài phút ... –

+0

Google phải lập chỉ mục SO trong thời gian thực: Tôi đang sử dụng cảnh báo google đơn giản trên Mono.Cecil. –

+0

Wow - ấn tượng. –

2

Dưới đây là làm thế nào để thiết lập tên Các tham số của thuộc tính tùy chỉnh hoàn toàn bỏ qua cài đặt của một giá trị thuộc tính bằng cách sử dụng các hàm tạo của nó. Lưu ý rằng bạn không thể đặt CustomAttributeNamedArgument.Argument.Value hoặc thậm chí CustomAttributeNamedArgument.Argument trực tiếp khi chúng được đọc.

Sau đây là tương đương với thiết - [XXX(SomeNamedProperty = {some value})]

var attribDefaultCtorRef = type.Module.Import(typeof(XXXAttribute).GetConstructor(Type.EmptyTypes)); 
    var attrib = new CustomAttribute(attribDefaultCtorRef); 
    var namedPropertyTypeRef = type.Module.Import(typeof(YYY)); 
    attrib.Properties.Add(new CustomAttributeNamedArgument("SomeNamedProperty", new CustomAttributeArgument(namedPropertyTypeRef, {some value}))); 
    method.CustomAttributes.Add(attrib); 
Các vấn đề liên quan