我想要做类似于: 用户输入类+字段的名称。 代码发现是否曾经声明过具有该名称的类。 代码创建带有字段的类。用类名称动态创建类
我知道我可以做到这一点与许多开关柜,但我可以根据用户输入有点自动化? 用户输入的名称将是类名称。 我正在C#中完成这项工作。
我想要做类似于: 用户输入类+字段的名称。 代码发现是否曾经声明过具有该名称的类。 代码创建带有字段的类。用类名称动态创建类
我知道我可以做到这一点与许多开关柜,但我可以根据用户输入有点自动化? 用户输入的名称将是类名称。 我正在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 FieldType
和String 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);
嗯,感谢您的洞察力。我可以使用Reflection来获得该类的属性。作为该程序的主要目的是使它们成为预定义的Xml Serializable类,我不认为我可以使用动态。 –
这有点棘手,但它是可行的。阅读接受的答案在这里:https://stackoverflow.com/questions/7501846/xml-serialize-dynamic-object –
为什么用户*是否需要知道名称或组成班级?如果他们有这样的知识水平,为什么他们需要程序员? – Plutonix
只是一个例子。实际上,我从源头获取数据,但试图将其序列化为一堆不同的类。我的代码在技术上是创建类的“用户”。 –
按名称创建一个班级是SO上比较常见的问题之一,你应该能够找到答案。我不明白的是“+字段”部分。你什么意思? – Crowcoder