2009-04-29 119 views
15

我可能會錯誤地問這一點,但能/你怎麼能找到內本身的一類領域...例如...C#反思:查找屬性的一個成員字段

public class HtmlPart { 
    public void Render() { 
    //this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false); 
    } 
} 

public class HtmlForm { 
    private HtmlPart _FirstPart = new HtmlPart();  
    [Optional] //<-- how do I find that? 
    private HtmlPart _SecondPart = new HtmlPart(); 
} 

或者,也許我只是這樣做不正確......如何調用一個方法,然後檢查應用於自身的屬性?

此外,爲了問題的緣故 - 我只是好奇,如果有可能找到屬性信息而不知道/訪問父類!

回答

12

如果我正確理解你的問題,我想你正在嘗試做的是不可能的...

Render方法,你想應用到該對象的可能的屬性。屬性屬於_SecondPart女屬於HtmlForm類。

對於工作,你就必須調用對象傳遞給Render方法:

public class HtmlPart { 
     public void Render(object obj) { 
      FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

      foreach (var fi in infos) 
      { 
       if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true)) 
        Console.WriteLine("Optional is Defined"); 
      } 
     } 
    } 
+0

謝謝 - 這似乎是'可能的',但是我再次發現只有足夠的缺失而無法正常工作。 – Hugoware 2009-04-29 17:13:52

5

可以使用Type.GetFields找到一個類中的字段,你可以使用MemberInfo.GetCustomAttributesIsDefined發現應用到字段屬性 - 但如果你需要找到一個特定類型的所有領域,你將不得不:

  • 遍歷所有你想對所有類型的每個組件
  • 迭代中在所有領域各類型中搜索
  • 反覆調整組件
  • 檢查每個字段的屬性是否存在/不存在

現在,如果您確實想知道「更難 - 因爲你必須知道系統中所有對象的全部內容。您還應該記住,可能有兩個具有相同值的兩個字段,即引用相同的對象。在這種情況下,對象是否會被視爲「可選」?

基本上,如果對象應該有一個屬性(例如可選或不),那麼它必須是對象本身的屬性,而不是包含屬性的字段。

這可能是我誤解你正在嘗試做什麼,但我嫌疑人它要麼不可行,要麼至少不是一個好主意。你能在這裏解釋更大的圖片嗎?你真的想用這個屬性來實現什麼?

+0

感謝您的答覆 - 現在它更多的實驗比什麼都重要的。我想知道這是否有可能,因爲這是一種古怪的方式來嘗試和獲取這些信息。 – Hugoware 2009-04-29 16:50:40

10

這裏給出一個對象的例子,如何找到,如果該對象的任何公共或私人領域有特定屬性:

var type = typeof(MyObject); 
foreach (var field in type.GetFields(BindingFlags.Public | 
      BindingFlags.NonPublic | BindingFlags.Instance)) 
{ 
    if (field.IsDefined(typeof(ObsoleteAttribute), true)) 
    { 
     Console.WriteLine(field.Name); 
    } 

} 

對於你的問題的第二部分,你可以檢查,如果一個屬性是在當前的方法defiend使用:

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute)); 

編輯

要回答你的編輯是它我可能不知道實際的類型。以下函數接受一個類型Parameter並返回具有給定屬性的所有字段。某個地方會知道你想要搜索的類型,或者將有一個你想要搜索的類型的實例。

沒有這些,你必須這樣做,因爲Jon Skeet說過要枚舉程序集中的所有對象。

public List<FieldInfo> FindFields(Type type, Type attribute) 
    { 
     var fields = new List<FieldInfo>(); 
     foreach (var field in type.GetFields(BindingFlags.Public | 
          BindingFlags.NonPublic | 
          BindingFlags.Instance)) 
     { 
      if (field.IsDefined(attribute, true)) 
      { 
       fields.Add(field); 
      } 

     } 
     return fields; 
    }