我在类上遵循特定约定的数字属性。例如
Person1 { get; set; }
Person2 { get; set; }
Person3 { get; set; }
我不想在类的实例上获得MethodInfo
对象,而是做这样的事情:
...
il.Emit(OpCodes.Callvirt, [instance]["set_Person" + index]);
上面的代码行是说明性的,而不是我认为它应该是什么。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
它无法完成,我不明白这一点或任何潜在的好处。 MSIL Callvirt指令不接受描述要调用的内容的字符串,它采用指向特定类型的特定方法的元数据标记,并且通过反射获取该值的唯一方法是使用MethodInfo实例。
这似乎不是一个复杂的选择:
il.Emit(OpCodes.Callvirt, type.GetMethod("set_Person" + index));
答案 1 :(得分:0)
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)));
}