我在遵循特定约定的类上有一个数字属性。例如。
Person1 { get; set; }
Person2 { get; set; }
Person3 { get; set; }
我不想MethodInfo
在类的实例上获取一个对象,而是做这样的事情:
...
il.Emit(OpCodes.Callvirt, [instance]["set_Person" + index]);
上面的代码行是说明性的,而不是我认为应该的。
有谁知道我怎么能做到这一点?
我在遵循特定约定的类上有一个数字属性。例如。
Person1 { get; set; }
Person2 { get; set; }
Person3 { get; set; }
我不想MethodInfo
在类的实例上获取一个对象,而是做这样的事情:
...
il.Emit(OpCodes.Callvirt, [instance]["set_Person" + index]);
上面的代码行是说明性的,而不是我认为应该的。
有谁知道我怎么能做到这一点?
这是不可能的,我不明白这一点或任何潜在的好处。MSIL Callvirt 指令不采用描述要调用什么的字符串,它采用指向特定类型的特定方法的元数据标记,并且通过反射获取该值的唯一方法是使用 MethodInfo 实例。
这看起来真的不是一个复杂的选择:
il.Emit(OpCodes.Callvirt, type.GetMethod("set_Person" + index));
public class Sample
{
public int Person1 { get; set; }
public int Person2 { get; set; }
public int Person3 { get; set; }
}
static void Main(string[] args) {
var s = new Sample();
var tuples = new List<Tuple<string, int>> {
Tuple.Create("Person1", 1),
Tuple.Create("Person2", 2),
Tuple.Create("Person3", 3)
};
var argument = Expression.Constant(s);
foreach (var item in tuples) {
CreateLambda(item.Item1, argument, item.Item2)
.Compile()
.DynamicInvoke();
}
}
static LambdaExpression CreateLambda(string propertyName, Expression instance, int value) {
return Expression.Lambda(
Expression.Assign(
Expression.PropertyOrField(instance, propertyName),
Expression.Constant(value)));
}