4

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

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

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

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

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

有谁知道我怎么能做到这一点?

4

2 回答 2

1

这是不可能的,我不明白这一点或任何潜在的好处。MSIL Callvirt 指令不采用描述要调用什么的字符串,它采用指向特定类型的特定方法的元数据标记,并且通过反射获取该值的唯一方法是使用 MethodInfo 实例。

这看起来真的不是一个复杂的选择:

il.Emit(OpCodes.Callvirt, type.GetMethod("set_Person" + index));
于 2013-06-24T15:35:04.983 回答
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)));
 }
于 2012-10-02T23:32:08.107 回答