1

カスタム属性を読み取るための式ツリーを使用してデリゲートを作成しようとしています。サンプルコードは

 [AttributeUsage(AttributeTargets.Class)]
public class TestAttribute : Attribute
{
    public string Description { get; set; }
}


 [TestAttribute(Description="sample text")]
 public class TestClass
 {
 }

FuncデリゲートでDescriptionプロパティ値を取得したい。実行時にこのデリゲートを作成する式でこれを達成したいので、次のようなものを書いてみました

public  Func<T, string> CreateDelegate<T>()
    {
       //Below is the code which i want to write using expressions
        //TestAttribute attribute = typeof(T).GetCustomAttributes(typeof(TestAttribute), false)[0];
        //return attribute.Description;

        ParameterExpression clazz = Expression.Parameter(typeof(T),"clazz");
        ParameterExpression description = Expression.Variable(typeof(string),"description");
        ParameterExpression attribute=Expression.Variable(typeof(TestAttribute),"attribute");

        MethodCallExpression getAttributesMethod = Expression.Call(typeof(Attribute).GetMethod("GetCustomAttributes"),clazz);

        Expression testAttribute = Expression.TypeAs(Expression.ArrayIndex(getAttributesMethod, Expression.Constant(0)), typeof(TestAttribute));
        BinaryExpression result = Expression.Assign(description, Expression.Property(testAttribute, "Description"));

        BlockExpression body = Expression.Block(new ParameterExpression[] { clazz, attribute,description },
            getAttributesMethod, testAttribute, result);             

        Func<T, string> lambda = Expression.Lambda<Func<T, string>>(body, clazz).Compile();
        return lambda;
    }

しかし、このメソッドを呼び出すと、getAttributesMethod行でAmbiguousMatchExceptionが発生し、「あいまいな一致が見つかりました」と表示されます。では、式ツリー内でAttribute.GetCustomAttribute()メソッドを使用するにはどうすればよいですか?

4

2 に答える 2

0

実際には、ここにあるリフレクションのブロックです。

typeof(Attribute).GetMethod("GetCustomAttributes")

GetMethodオーバーロードがあり、パラメーターの型を指定しないと、その例外がスローされます。

試す:

typeof(Attribute).GetMethod("GetCustomAttributes", new [] {typeof(MemberInfo)})
于 2012-04-09T12:51:29.543 に答える
0

これを試して:

MethodCallExpression getAttributesMethod = Expression.Call(typeof(Attribute),
    "GetCustomAttributes", null, Expression.Constant(typeof(T)));

しかし、なぜあなたは を返すのFunc<T, string>ですか? デリゲート呼び出しのパラメーターとして何を使用しますか?

于 2012-04-09T16:32:53.853 に答える