我想要做類似於: 用戶輸入類+字段的名稱。 代碼發現是否曾經聲明過具有該名稱的類。 代碼創建帶有字段的類。用類名稱動態創建類
我知道我可以做到這一點與許多開關櫃,但我可以根據用戶輸入有點自動化? 用戶輸入的名稱將是類名稱。 我正在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