2010-07-22 45 views
3

我有一些代碼通過從某個類派生的類。我們稱之爲參數類。
該代碼使用反射來遍歷類的成員並分析賦予它們的某些自定義屬性。基本上,它是一個可配置的解析器,它將根據屬性分析輸入並將其找到的數據放入數據成員中。解決在C中丟失的MI#

這是在我們的代碼中的幾個地方使用。您可以指定參數類,放入屬性數據成員,並將其傳遞給解析器。例如:

public class MyFancyParameters : ParametersBase 
{ 
    [SomeAttribute(Name="blah", AnotherParam=true)] 
    public string Blah { get; set; } 

    // .. .more such stuff 
} 

var parameters = new MyFancyParameters(); 
Parser.Parse(input, parameters); 

在很多地方都有類似的需要分析的屬性數據成員組。所以參數類在某些地方是相似的。這是多餘的,當然,這很痛苦。無論何時我需要在這樣的領域進行改變,我都需要在六個地方,所有的克隆中進行改變。只是時間問題,這些部分將開始漂移。

但是,相似性無法分組在非循環圖中,所以我不能使用單繼承對它們進行分組。
我會在C++中做的是將這些類似的東西塊放到他們自己的類中,只是繼承一堆包含我需要的任何東西,然後完成。 (我認爲這被稱爲混合繼承。)
但是,C#沒有多重繼承。所以我正在考慮將這些塊放入數據成員中,並更改解析器以緩存到數據成員中。但是這會使解析器複雜化。

還有什麼?

回答

1

您可以讓您的解析器接受參數類的集合而不是單個參數類嗎?或者,您可以允許解析器遞歸到您的參數類中,並讓它將其他參數類作爲屬性提供。基本上,從ParametersBase類型繼承的ParametersBase派生類的每個屬性都被遞歸併平展到一個參數列表中。

其實,我剛剛看到你已經提到了遞歸解決方案。我認爲這可能是你最好的選擇,支持也不是太複雜。您應該能夠創建一個幫助函數來枚舉使層次結構看起來像扁平類的參數屬性。


如果我正確理解您的要求,以下代碼將提供您的屬性的'平面'視圖。你可能會想增加額外的保障產品代碼(如保持類型的堆棧檢測循環引用。)

public class ParametersParser 
{ 
    public static IEnumerable<PropertyInfo> GetAllParameterProperties(Type parameterType) 
    { 
     foreach (var property in parameterType.GetProperties()) 
     { 
      if (Attribute.IsDefined(property, typeof(SomeAttribute))) 
       yield return property; 

      if (typeof(ParametersBase).IsAssignableFrom(property.PropertyType)) 
      { 
       foreach (var subProperty in GetAllParameterProperties(property.PropertyType)) 
        yield return subProperty; 
      } 
     } 
    } 
} 
+0

更改解析器遞歸分析參數類我看起來難度比你似乎想想,但這不是不可能的。但是,我希望除了黑客圍繞語言限制外,還有其他的東西。有沒有什麼聰明的我可以做接口? – sbi 2010-07-22 17:32:33

+0

您可以使用不同參數「組」的接口,但在進行更改時仍然需要更改組的每次使用。使用接口的唯一好處是,如果您忘記修改其中一個組以匹配更新後的界面,則會出現編譯錯誤,但這也意味着您需要更改一個位置。 – 2010-07-22 17:42:35

+0

進一步閱讀,我可以看到,您還需要跟蹤對象值,這使得它比簡單地「展平」屬性列表更復雜。這就是說,我想不出一個更好的解決方案。所有其他解決MI的方法仍然需要編寫樣板文件來轉發方法或屬性,這種重複的樣板正是你想要避免的。 – 2010-07-22 17:58:37

相關問題