我有以下代码作为使用反射生成接口的系统的一部分.emit
void IPropertyCreator.AddAttribute<T>(params object[] args)
{
// Convert args to types
var argTypes = new Type[args.Length];
for (int i = 0; i < args.Length; ++i)
{
argTypes[i] = args[i] != null ? args[i].GetType() : null;
}
// Get constructor
var ctorInfo = typeof(T).GetConstructor(argTypes);
// Create custom attribute
var attrBuilder = new CustomAttributeBuilder(ctorInfo, args);
_propertyBuilder.SetCustomAttribute(attrBuilder);
}
在出现问题的情况下,我正在T
使用带有单个
object
参数的构造函数创建一个属性(类型参数),并且参数是一个decimal
属性具有(仅)以下构造函数
public DefaultValueAttribute(object value)
此代码适用于所有 POD 类型(byte
、char
、int
等),string
但在使用decimal
. 构造函数CustomAttributeBuilder
失败,出现异常"Passed in argument value at index 0 does not match the parameter type"。
调试显示所有变量都符合预期:
args
有一个类型的元素object{decimal}
argTypes
有一个元素类型=System.Decimal
ctorInfo
正确选择了(唯一)采用对象参数的构造函数。
我已经证明可以通过直接传递十进制参数来实例化该属性:
decimal val = 123.456M;
var attr = new DefaultValueAttribute(val);
我尝试将小数转换为 anobject
和 aSystem.Decimal
无效。我怀疑这个问题与这样一个事实有关,decimal
即不是 POD 类型而是结构。
我尝试向属性添加构造函数重载(采用decimal
类型)。上述函数正确地选择了新的构造函数,但随后在同一个地方失败,除了“无效类型被用作自定义属性构造函数参数、字段或属性”之外
有谁知道我该如何解决这个问题?