与えられた関数
T Func<T>(string val) {}
ここで、目標は val を T に変換することです。ここで、T は int にすることも、List にすることもできます (この場合、val は Ts に変換できるコンマ区切りのリストです)。
簡単なので、intバージョンを無視して、どのように文字列をリストに変換しますか
与えられた関数
T Func<T>(string val) {}
ここで、目標は val を T に変換することです。ここで、T は int にすることも、List にすることもできます (この場合、val は Ts に変換できるコンマ区切りのリストです)。
簡単なので、intバージョンを無視して、どのように文字列をリストに変換しますか
この質問を入力していると、答えが出てきたので、この質問の回答を他の人へのガイドとして残します.
私は次のような機能を持っています
T Func<T>(string val) {}
この関数内でさまざまな処理を行いますが、そのうちの 1 つは val を T に変換することです。
この目的のために使用する別の機能があります
T ChangeType<T>(this object value)
この関数は主に Convert.ChangeType のラッパーであり、Convert.ChangeType がそのままでは実行できないことを処理するために、いくつかの追加処理が行われます (他の場所の stackoverflow から盗まれました)。
すべてがほとんどのタイプでうまく機能しますが、T がリストで、val が値のコンマ区切りのリストである場合もあります。
T が List であるかどうかを正しく判断できます
if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(List<>))
次に、適切なリストの戻り値の型を次のようにインスタンス化できます。
T list = (T)Activator.CreateInstance(returnType);
ここで、文字列の分割値ごとに ChangeType を呼び出し、それらをリストに追加する必要があります。
var method = typeof (XmlUtil).GetMethod("ChangeType", new [] {typeof(object)});
var genericMethod = method.MakeGenericMethod(subType);
var convertedItem = genericMethod.Invoke(null, new [] {item});
var subType = returnType.GetGenericArguments()[0];
これまでのところすべて順調です。今、私は持っています
dynamic list; //instantiated with a List<TT>
var convertedItem; // which is typed as an object, instantiated with a type TT.
どうやって電話するの?
list.Add(convertedItem);
ダイナミックは、リストの既知のインターフェイスがないという事実を処理しますが、オブジェクトが実際にはインスタンス化された T 型であっても、オブジェクトをリストに追加しようとしているため、実行時にエラーが発生します。
究極の答えは、リストを非ジェネリック IList としてキャストし、そこにオブジェクトを追加することです。
System.Collections.IList list2;
list2 = (System.Collections.IList) list;
list2.Add(convertedItem);