1

我有一段非常简单的代码

var propertyBuilder =
    typeBuilder.DefineProperty(upperName, PropertyAttributes.None, propertyType, new[] { propertyType });
propertyBuilder.SetConstant(Convert.ChangeType(propertyInfo.Default, propertyType));

之后,当我调用CreateType()方法并创建类的实例时,我试图检查分配了默认值的属性的值,但我看不到任何更改。

创建类的实例后,我无法使用SetValue方法,因为所有构造的类型都存储在元数据字典中,并且可以从代码中的不同位置使用。

任何建议为什么SetConstant方法不起作用?

4

1 回答 1

2

SetConstant()不做你认为它做的事。它设置与属性关联的“默认值”,但该值实际上并未在任何地方使用(尽管您可以使用 检索它GetConstantValue())。

要从属性的 getter 中实际返回一些常量值,您需要创建 getter 方法并将其 IL 设置为返回值。但是由于您不能在程序集本身中存储任意类型,因此通常很难做到这一点。例如,如果属性是int,它将如下所示:

var getMethodBuilder = typeBuilder.DefineMethod(
    "get_" + upperName, MethodAttributes.Public, typeof(int), Type.EmptyTypes);

var il = getMethodBuilder.GetILGenerator();
il.Emit(OpCodes.Ldc_I4, defaultValue);
il.Emit(OpCodes.Ret);

var propertyBuilder = typeBuilder.DefineProperty(
    upperName, PropertyAttributes.None, typeof(int), Type.EmptyTypes);
propertyBuilder.SetGetMethod(getMethodBuilder);

ldc.i4是一条 IL 指令,用于将常量整数加载到 IL 堆栈中。对于其他类型,您将需要不同的说明。

于 2012-08-16T16:58:56.133 回答