我需要在C#中创建一个动态可扩展的类。 目标是创建一个类,其中包含来自Android SQLite Contacts表的给定联系人的所有信息。该表的结构有点奇怪,因为它没有设置字段名称,但使用“字段名称”和“字段内容”的列。
这就是我想要变成一个可用的格式,其中代码读取数据库,并为每个条目创建匹配的子变量。这样我想知道最好的方法(我猜一个简单的
){
this.(variableNames[i].ToString()) = variableContent[i];
}
不会这样做,什么是最少的资源,但最快(最简单)的方式。
如果我们在这里,是否有任何方法可以调用类型(比方说,我创建一个新的联系人,包含电子邮件,工作区,名称和图像标签,但这些变量名称'未知)ALL sub -variables(Contact.image,Contact.FirstName,Contact.Email等)动态地?
当然,所有联系人都应该有标准化字段(三个名称中的一个,电话号码,电子邮件@work和@home等),但这些也应该动态调用。
答案 0 :(得分: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"]; }
}
答案 1 :(得分:2)
如果您愿意使用动态类型,则可以使用C#4中的dynamic
类型。您可以使用ExpandoObject或DynamicObject作为联系人类型的基础。< / p>
以下是一个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;
}
}
然后你可以这样使用:
// 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);
除了使用dynamic
之外,您无法创建具有动态类型属性的新类。毕竟,你将如何消费这些属性?你可能最好创建一个包含你必须拥有的属性的类;并将其余部分放在Dictionary<string,object>
。
答案 2 :(得分:0)
如果您使用的是.NET 4.0,则会提供动态支持。您可以创建如下对象:
var newContact = new object { FirstName = "name", LastName = "name", etc... };
或者,您可能想尝试使用词典。