0

我正在開發一個項目,它將序列化/存儲CSV文件中的對象。 (是的,我知道這不是最佳做法,但這是必須的。)我可以將屬性動態應用於對象字段嗎?

我試圖保持我的解決方案清潔,所以我在解決方案中有多個項目,其中之一是一個庫項目包含存儲/序列化方法。該項目引用了CSVhelper,這是我喜歡用來執行CSV操作的第三方庫。

在項目甲

foo myobject = new foo(x,y,z); 
B.WriteToCsv(myobject); 

在項目B(我的lib中,引用csvhelper)

public static WriteToCsv(foo myobject); // csvhelper would do the work 

然而,Csvhelper需要我foo的對象上設置之後才能夠操作的某些屬性在上面。

我試圖避免在我的Foo對象類定義文件將這些屬性,而不是我希望能夠動態的應用項目B.內這些屬性

我的問題是,是否有可能以後應用屬性,動態?關鍵是要儘可能保持我的項目清潔,但我覺得這會讓事情變得更加複雜。這是一個壞主意,還是有這個問題的通用解決方案?


要求更新,與例如:

我Foo對象的定義:

public class Foo 
{ 
    public string a; 
    public string b; 
    public int c; 
} 

CsvHelper需要在這樣的字段屬性:

public class Foo 
{ 
    [CsvColumn(Name = "a", FieldIndex = 1)] 
    public string a; 
    [CsvColumn(Name = "b", FieldIndex = 2)] 
    public string b; 
    [CsvColumn(Name = "c", FieldIndex = 3)] 
    public int c; 
} 

爲了保持我的代碼乾淨,我想避免在這裏添加這些屬性,因爲我想保留與storin相關的所有代碼g /序列化在我單獨的庫中。 (項目B)

+2

「屬性」是指屬性或.NET屬性,例如。 '[序列化]'?如果你提供一個簡短但完整的例子,那真的很有幫助。 – 2014-10-06 08:40:28

+0

@JonSkeet更新。我的意思是.NET中的屬性,是的。 [XYZ] – 2014-10-06 09:15:58

回答

1

是的,沒有。在你的情況 - 編號

你可以假設地動態添加屬性,但這需要完全不同的反射方法。見http://msdn.microsoft.com/en-us/library/ms171819.aspx
我懷疑第三方庫支持這個。

當需要靈活性時,我寧願將類型/對象與某種配置關聯。
如果需要附加一些值到對象,請考慮ConditionalWeakTable

但不幸的是,所有這些變種不能用於你的情況。

如果需要分離關注剛剛創建的DTO與正確應用的屬性和使用某種類型的映射器(例如Automapper)可以輕鬆地轉換實體。

3

您不能將像[XYZ]這樣的屬性插入現有編譯代碼,它必須在編譯時出現。

類庫處理此類事情的典型方法是它可能有一個重載,它接受包含元數據的數據結構,另一個重載從屬性中提取元數據。如果這個類庫中沒有這樣的重載,那麼你運氣不好。

可能在運行時生成後代類,如果類允許繼承,在這種情況下,你可以添加你認爲合適的任何屬性。根據安全模型和現有類,這可能會或可能不會成爲您的選擇。

1

對此的常見模式是「助手」實用程序使用屬性或解析器或兩者的系統。 ProtoBuf就是一個很好的例子。模式是這樣的;

  1. 調用者傳遞一個接口指針到一個Resolver方法。
  2. 幫助器函數調用解析器來輸入它的處理,它可以返回關於如何處理類型的特定信息。
  3. 如果沒有通過Resolver接口,或者對Resolver的調用無法提供有用的信息,則Helper會回退到屬性以查看它們是否提供必要的信息。

這是一個非常整潔的系統,橋接SOLID世界和較早的基於屬性的編程風格。

+0

謝謝你的例子! – 2014-10-07 09:28:25

相關問題