TypeBuilder - 添加属性

时间:2015-05-15 16:06:37

标签: c# dynamic properties custom-attributes typebuilder

我有一个使用TypeBuilder构建动态类型的帮助器类。它使用如下:

var tbh = new TypeBuilderHelper("MyType");
tbh.AddProperty<float>("Number", 0.0f);
tbh.AddProperty<string>("String", "defaultStringValue");
tbh.Close();

var i1 = tbh.CreateInstance();
var i2 = tbh.CreateInstance();

我现在想要添加对属性属性(现有属性类型,而不是动态生成的类型)的支持,包括:

public class TypeBuilderHelper
    {
        public void AddProperty<T>(string name, T defaultValue, params Attribute[] attributes)
        {
            // ...
        }
    }

public class SomeAttribute : Attribute
    {
        public SomeAttribute(float a) { }
        public SomeAttribute(float a, int b) { }
        public SomeAttribute(float a, double b, string c) { }
    }

 var tbh2 = new TypeBuilderHelper("MyType2");
 tbh2.AddProperty<float>("Number", 0.0f, new SomeAttribute(0.0f, 1));
 tbh2.AddProperty<string>("String", "defaultStringValue");
 tbh2.Close();

 var i3 = tbh.CreateInstance();
 var i4 = tbh.CreateInstance();

但我不确定这是怎么回事。我正在使用PropertyBuilder创建属性,但CustomAttributeBuilder需要一个构造函数签名和构造函数args,而我所拥有的只是构造属性的一个实例。

1 个答案:

答案 0 :(得分:3)

属性的实例在这里没有用,您需要定义构造函数和应该调用的值。一个简单的解决方案可能是更改AddProperty Signature并使用params CustomAttributeBuilder参数交换params属性参数,并构造Builder实例而不是属性。

var ci = typeof(SomeAttribute).GetConstructor(new Type[] { typeof(float), typeof(int) });
var builder = new CustomAttributeBuilder(ci, new object[] { 0.0f, 1 });