2011-01-19 107 views
2

我需要在C#中創建一個動態擴展類。 目標是創建一個類,它可以包含來自Android SQLite聯繫人表的給定聯繫人的所有信息。該表的結構有點奇怪,因爲它沒有設置字段名稱,但使用「字段名稱」和「字段內容」的列。C# - 動態生成的類?

這就是我想變成代碼讀取數據庫的可用格式,併爲每個條目創建匹配的子變量。這樣我想知道最好的方法,這樣做(我想一個簡單的

{ 
    this.(variableNames[i].ToString()) = variableContent[i]; 
} 

不會做),什麼是最少資源爲主食,但最快的(和最簡單的)的方式。

而且,如果我們在這裏,是否有任何方法來調用類型(比方說,我創建一個新的與電子郵件,工作場所,名稱和圖像標籤的聯繫人,但這些變量名稱是未知的)子變量(Contact.image,Contact.FirstName,Contact.Email等)動態?

當然,在所有聯繫人(三個姓名,電話號碼,電子郵件@工作和@家庭等等)中應該有標準化的字段,但這些也應該被動態調用。

+0

如何實現某種類型的集合/列表/字典,泛型會爲您提供所需的很好的強類型以便於管理? – 2011-01-19 18:47:07

回答

5

改爲使用Dictionary<string,string>

Dictionary<string,string> contactInfo = new Dictionary<string,string>(); 

public void ImportContact() 
{ 
    ... 
    // for each fieldName and fieldValue from your table 
    contactInfo.Add(fieldName, fieldValue); 
    ... 
    // check that all standard fields are present, if desired 
} 

public string FirstName 
{ 
    get { return contactInfo["FirstName"]; } 
} 
+0

是的,字典似乎是一個很好的解決方案,謝謝大家! – fonix232 2011-01-19 18:59:52

0

如果您使用的是.NET 4.0,則會有動態支持。您可以創建如下對象:

var newContact = new object { FirstName = "name", LastName = "name", etc... }; 

或者,您可能想嘗試使用字典。

2

如果您願意使用動態類型,則可以在C#4中使用dynamic類型。可以使用ExpandoObjectDynamicObject作爲聯繫類型的基礎。

下面是一個Contact類的例子,它既可以靜態類型化,也可以使用一些預定義的屬性;並且可以在運行時附加屬性。

class Contact : DynamicObject 
{ 
    private readonly Dictionary<string, object> bag = new Dictionary<string, object>(); 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public object this[string key] 
    { 
     get { return bag[key]; } 
     set { bag[key] = value; } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (bag.ContainsKey(binder.Name)) 
     { 
      result = bag[binder.Name]; 
      return true; 
     } 
     return base.TryGetMember(binder, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     bag[binder.Name] = value; 
     return true; 
    } 
} 

然後你就可以使用這樣的:當靜態地對待它,你仍然可以通過使用索引獲取值

比使用 dynamic
// Contact is statically typed. 
    Contact c = new Contact(); 
    c.FirstName = "test";  

    // Treat as dynamic and attach some extra properties: 
    dynamic dynContact = c; 
    dynContact.AddressOne = "Somewhere"; 
    dynContact.AddressTwo = "Someplace else"; 
    Console.WriteLine(dynContact.AddressOne); 
    Console.WriteLine(dynContact.AddressTwo); 

其他,你不能創建一個新的類動態類型的屬性。畢竟,你將如何消費這些屬性?你最好創建一個包含你必須擁有的屬性的類;並把其餘的在Dictionary<string,object>