TypeBuilder - 添加属性
TypeBuilder - Adding attributes
我有一个助手 class,它使用 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 需要构造函数签名和构造函数参数,而我所拥有的只是一个构造属性的实例。
属性的实例在这里没有帮助,您需要定义构造函数和应调用的值。一个简单的解决方案可能是更改 AddProperty 签名并将 params 属性参数与 params CustomAttributeBuilder 参数交换并构造 Builder 实例而不是属性。
var ci = typeof(SomeAttribute).GetConstructor(new Type[] { typeof(float), typeof(int) });
var builder = new CustomAttributeBuilder(ci, new object[] { 0.0f, 1 });
我有一个助手 class,它使用 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 需要构造函数签名和构造函数参数,而我所拥有的只是一个构造属性的实例。
属性的实例在这里没有帮助,您需要定义构造函数和应调用的值。一个简单的解决方案可能是更改 AddProperty 签名并将 params 属性参数与 params CustomAttributeBuilder 参数交换并构造 Builder 实例而不是属性。
var ci = typeof(SomeAttribute).GetConstructor(new Type[] { typeof(float), typeof(int) });
var builder = new CustomAttributeBuilder(ci, new object[] { 0.0f, 1 });