• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

用类名称动态创建类

c/c++ 来源:Jarren Ong 4次浏览

我想要做类似于: 用户输入类+字段的名称。 代码发现是否曾经声明过具有该名称的类。 代码创建带有字段的类。用类名称动态创建类

我知道我可以做到这一点与许多开关柜,但我可以根据用户输入有点自动化? 用户输入的名称将是类名称。 我正在C#中完成这项工作。


===========解决方案如下:

命名空间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); 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)