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 に答える