2012-04-12 98 views
3

當我在我的類中的公共財產,我應該怎麼將其標記(某些屬性)如何忽略屬性被忽略時,以下給出標誌使用反射

BindingFlags.DeclaredOnly | 
BindingFlags.Instance | 
BindingFlags.NonPublic | 
BindingFlags.Public 

我需要使用方法從DLL與參數:對象和綁定標誌,所以我需要標記我的屬性不知何故被這種方法忽略

+4

當您正在檢查屬性時,不能跳過它嗎? – Magnus 2012-04-12 20:21:38

+0

如果您希望用戶能夠指定何時忽略,我建議您在API中使用參數以供用戶指定要忽略的屬性,或使用指示應該忽略的自定義屬性。或者,你是說答案必須遵循這些標誌,只有這些標誌? – payo 2012-04-12 20:22:09

+0

@Magnus否因爲我使用dll的方法:D – kosnkov 2012-04-12 20:22:13

回答

3

我認爲你混淆了BindingFlags和CustomAttributes的角色。 BindingFlags根據它們是否爲private,static等找到東西。

如果您要忽略消費代碼中的某個屬性,則需要更改該消費代碼以忽略具有與其關聯的特定自定義屬性的屬性。

如果您無權訪問消費代碼,那麼沒有任何方法可以使其無法看到存在的屬性。不過,根據編寫代碼的方式,可能會有一些解決方法。例如,如果代碼是基於特定類型參數進行搜索的,則可以創建一個抽象基類來容納所有您希望關注的屬性,然後爲您的實際實現擴展該類,爲您添加一些額外屬性方便。

或者您可以創建一個DTO來表示您要傳遞給您調用的方法的屬性,並將適當的屬性從原始對象複製到該DTO中。

+0

如果他沒有結束他的問題,那麼我會完全同意這個問題。請注意,我對他的問題的評論涉及到你正在提出的這一點。另外,嗨:) – payo 2012-04-12 20:24:49

+0

鑑於他的旗幟,有一種方法,因爲他的旗幟不會收拾靜態。 – payo 2012-04-12 20:29:09

+0

@StriplingWarrior我不知道如何通過反射解析合適的東西,但不可能標記一些filds爲「反思!我是專業領域不看我,繼續前進」?以及如果給那個方法所有可能的綁定標誌呢?那麼沒有其他方式仍然忽略一些然後改變造型?? – kosnkov 2012-04-12 20:29:34

0

您的標誌不會返回靜態屬性。

class Foo 
{ 
    public static int Bar { get; set; } 
} 

編輯你說你不想改變自己的行爲。你的dll是否需要一個對象或類型?如果一個類型,你可以使用繼承來'隱藏'你的屬性從這個方法。

說你現在所擁有的:

class Foo 
{ 
    public int X {get;set;} 
    public int Y {get;set;} 
} 

而且你的代碼期望FooXY。如果您的dll /實用程序需要類型,那麼我們可以使FooBar派生。假設我們不希望實用程序看到「X」,而只看到「Y」。

class Bar 
{ 
    public int Y {get;set;} 
} 

class Foo : Bar 
{ 
    public int X {get;set;} 
} 

//你的程序調用的

utility.Baz(foo.GetType().BaseType); // <- Base here is Bar, which does not have X 
0

在通話過程中忽略它的唯一方法就是使用Type.FindMembers,但可能會需要更多的工作不僅僅是後過濾它。

0

我認爲自定義屬性在這裏是適當的。使用該屬性裝飾您希望忽略的成員,並將您正在使用的代碼封裝在例程中檢查屬性,以清除裝飾項目。

0

你可以用一個簡單的擴展方法做到這一點:

public static class ExtensionMethods 
{ 
    public static PropertyInfo[] GetNonPublicProperties(this Type t) { 
     return t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Where(prop => prop.GetAccessors(true).Where(mi => mi.IsPublic == false).Count() != 0).ToArray(); 
    } 
} 

然後,只需使用Type.GetNonPublicProperties和你設置。