-2

与えられた関数

T Func<T>(string val) {}

ここで、目標は val を T に変換することです。ここで、T は int にすることも、List にすることもできます (この場合、val は Ts に変換できるコンマ区切りのリストです)。

簡単なので、intバージョンを無視して、どのように文字列をリストに変換しますか

4

1 に答える 1

-2

この質問を入力していると、答えが出てきたので、この質問の回答を他の人へのガイドとして残します.

私は次のような機能を持っています

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);
于 2013-10-02T17:13:19.850 に答える