C# - 动态生成的类?

时间:2011-01-19 18:41:38

标签: c# class dynamic

我需要在C#中创建一个动态可扩展的类。 目标是创建一个类,其中包含来自Android SQLite Contacts表的给定联系人的所有信息。该表的结构有点奇怪,因为它没有设置字段名称,但使用“字段名称”和“字段内容”的列。

这就是我想要变成一个可用的格式,其中代码读取数据库,并为每个条目创建匹配的子变量。这样我想知道最好的方法(我猜一个简单的

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

不会这样做,什么是最少的资源,但最快(最简单)的方式。

如果我们在这里,是否有任何方法可以调用类型(比方说,我创建一个新的联系人,包含电子邮件,工作区,名称和图像标签,但这些变量名称'未知)ALL sub -variables(Contact.image,Contact.FirstName,Contact.Email等)动态地?

当然,所有联系人都应该有标准化字段(三个名称中的一个,电话号码,电子邮件@work和@home等),但这些也应该动态调用。

3 个答案:

答案 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类型。您可以使用ExpandoObjectDynamicObject作为联系人类型的基础。< / 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... };

或者,您可能想尝试使用词典。