如何在没有*具有MethodInfo的情况下使用MSIL *在实例上调用方法?

时间:2012-09-28 08:43:06

标签: c# reflection dynamic-programming cil

我在类上遵循特定约定的数字属性。例如

Person1 { get; set; }
Person2 { get; set; }
Person3 { get; set; }

我不想在类的实例上获得MethodInfo对象,而是做这样的事情:

...
il.Emit(OpCodes.Callvirt, [instance]["set_Person" + index]);

上面的代码行是说明性的,而不是我认为它应该是什么。

有谁知道如何解决这个问题?

2 个答案:

答案 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)));
 }