私は次のようなことをしたい: クラス+フィールドのユーザー入力名。 コードは、その名前のクラスが宣言されているかどうかを調べます。 コードはフィールドを持つクラスを作成します。クラス名を使ってクラスを動的に作成する
私はこれを多くのスイッチのケースで行うことができますが、私はユーザーの入力に基づいてこれを幾分自動化できますか? ユーザーが入力する名前はクラス名になります。 私は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に関するより頻繁な質問の1つです。答えを見つけることができるはずです。私が理解していないのは、 "+フィールド"の部分です。どういう意味ですか? – Crowcoder