2016-02-22 29 views
0

我希望能夠檢查類的實例上的自定義屬性的存在,但我希望能夠從該類的構造函數中執行該檢查。看看這個僞代碼:如何判斷使用接口的實例變量是否應用了自定義屬性?

namespace TestPackage 
{ 
    public class MyAttribute : Attribute { } 
    public interface IMyThing { } 

    public class MyThing : IMyThing 
    { 
     private bool HasMyAttribute { get; set; } 

     public MyThing() 
     { 
      if (/* some check for custom attribute */) 
      { 
       HasMyAttribute = true; 
      } 
     } 
    } 

    public class MyWrapper 
    { 
     [MyAttribute] 
     private readonly IMyThing _myThing; 

     public MyWrapper() 
     { 
      _myThing = new MyThing(); 
     } 
    } 
} 

我有代碼註釋的if語句就是我想填寫的內容。這是可能的嗎?

+5

不,這是不可能的。該屬性不應用於類實例,它應用於該字段。 – Amy

+1

這對我來說似乎是一種反模式... – lintmouse

+0

屬性在代碼中是靜態定義的,因此是靜態的,它們不會綁定到實例。它們適用於某種類型或這種類型的成員。 –

回答

2

屬性在代碼中靜態定義的,因此是靜態的,他們沒有必然的情況。它們適用於某種類型或這種類型的成員。

在你的情況下,你可以讓你的包裝實現IMyThing並使用它來代替原始類型,然後將該屬性應用到類中。

[MyAttribute] 
public class MyWrapper : IMyThing 
{ 
    private readonly IMyThing _myThing; 

    public MyWrapper() 
    { 
     _myThing = new MyThing(); 
    } 

    public void DoMyThingStuff() 
    { 
     _myThing.DoMyThingStuff(); 
    } 
} 

然後你就可以檢查這樣的屬性:

bool CheckAttribute(IMyThing myThing) 
{ 
    Type t = myThing.GetType(); 
    return t.GetCustomAttributes(typeof(MyAttribute), false).Length > 0; 
} 

如果原來的類的對象傳遞,你false。如果包裝對象被傳遞,你得到true

你也可以從原始類派生一個類,而不是創建一個包裝器。

[MyAttribute] 
public class MyDerived : MyThing 
{ 
} 
-1

使用這個構造:

public MyThing 
{ 
       HasMyAttribute =false; 
       foreach (MemberInfo item in this.GetType().GetCustomAttributes(false)) 
       { 
         if(item.Name=="MyAttribute") 
          HasMyAttribute =true; 
       } 

} 
+0

這是一個明顯錯誤的答案。 –

+0

被標記爲答案的答案几乎是相同的方法 – nAviD

相關問題