6

GetCustomAttributes()プロパティで定義された属性を取得するために使用しようとしています。問題は、プロパティがオーバーライドされたものであり、式からオーバーライドされたプロパティを抽出する方法がわからないことです。基本クラスのものを取得する方法しか理解できません。

ここにいくつかのコードがあります

public class MyAttribute : Attribute 
{
  //... 
}

public abstract class Text
{
  public abstract string Content {get; set;}
}

public class Abstract : Text
{
  [MyAttribute("Some Info")]
  public override string Content {get; set;}
}

MyAttribute今、私は抽象クラスから抜け出そうとしています。しかし、私はそれを介して取得する必要がありExpressionます。これは私が使用しているものです:

Expression<Func<Abstract, string>> expression =  c => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(memberType, true);

残念ながらatts、空になってしまいます。問題は、クラスの代わりになっmenberTypeてしまうことです。したがって、属性を取得しても、何も返されません。Text.ContentAbstract.Content

4

1 に答える 1

4

MemberExpressionはオーバーライドを無視し、ベースタイプからプロパティを返すため、機能しTextていません。そのため、属性が見つかりません。

この問題については、ここで読むことができます:式から子宣言型を取得するにはどうすればよいですか?

ただし、式にはすべての情報が含まれており、もう少し反映して属性を取得できます(すばやくダーティなサンプル)。

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name));
于 2012-04-26T05:52:01.793 に答える