使用类的名称动态创建类

时间:2017-12-03 02:02:27

标签: c# class dynamic automation

我想做的事情如下: 用户输入类+字段的名称。 代码查找是否曾声明具有该名称的Class。 代码使用字段创建Class。

我知道我可以用很多开关案例做到这一点,但我可以根据用户输入进行一些自动化吗? 用户输入的名称将是类名。 我是用C#做的。

1 个答案:

答案 0 :(得分:1)

System.Reflection.Emit命名空间可以为您提供在运行时创建动态类所需的工具。但是,如果您之前从未使用过它,那么您尝试完成的任务可能会变得非常困难。当然,预制代码可以提供很多帮助,我认为在这里你可以找到很多。

但我建议你另类路径。也许不那么灵活,但肯定很有趣。它涉及使用DynamicObject类:

public class DynamicClass : DynamicObject
{
    private Dictionary<String, KeyValuePair<Type, Object>> m_Fields;

    public DynamicClass(List<Field> fields)
    {
        m_Fields = new Dictionary<String, KeyValuePair<Type, Object>>();

        fields.ForEach(x => m_Fields.Add
        (
            x.FieldName,
            new KeyValuePair<Type, Object>(x.FieldType, null)
        ));
    }

    public override Boolean TryGetMember(GetMemberBinder binder, out Object result)
    {
        if (m_Fields.ContainsKey(binder.Name))
        {
            result = m_Fields[binder.Name].Value;
            return true;
        }

        result = null;
        return false;
    }

    public override Boolean TrySetMember(SetMemberBinder binder, Object value)
    {
        if (m_Fields.ContainsKey(binder.Name))
        {
            Type type = m_Fields[binder.Name].Key;

            if (value.GetType() == type)
            {
                m_Fields[binder.Name] = new KeyValuePair<Type, Object>(type, value);
                return true;
            }
        }

        return false;
    }
}

用法示例(请记住Field是一个小而简单的类,有两个属性,Type FieldTypeString FieldName,您必须自己实现):

List<Field>() fields = new List<Field>()
{ 
    new Field("ID", typeof(Int32)),
    new Field("Name", typeof(String))
};

dynamic myObj = new DynamicClass(fields);

myObj.ID = 10;
myObj.Name= "A";

Console.WriteLine(myObj.ID.ToString() + ") " + myObj.Name);