2011-01-19 67 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>