投稿したコードでは、実際にはそのタイプのオブジェクトをどこにもインスタンス化しませんでした。System.Type
のインスタンスをキャストしようとしているだけでList<int>
、意味がありません。コードを更新して実際にインスタンスを作成すると、次のように機能します。
int foo = 1;
Type unboundType = typeof(List<>);
Type w = unboundType.MakeGenericType(typeof(int));
if (w == typeof(List<int>))
{
Console.WriteLine("Yes its a List<int>");
object obj = Activator.CreateInstance(w);
try
{
((List<int>)obj).Add(foo);
Console.WriteLine("Success!");
}
catch(InvalidCastException)
{
Console.WriteLine("No you can't cast Type");
}
}
多分私はあなたの質問の要点を見逃しているだけです。確かにロジックによっては、コンパイル時にわからないタイプに基づいて if/else チェックを行うことができます (この例では、 で作業していることはわかっint
ていますが、実行時には必要に応じて他のタイプになる可能性があります) 。
編集:真のランタイム使用例を提供するために、次のことを考慮してください。
public object CreateList(Type elementType, object initialValue)
{
if (!elementType.IsAssignableFrom(initialValue.GetType()))
throw new ArgumentException("Incompatible types!");
Type unboundType = typeof(List<>);
Type listType = unboundType.MakeGenericType(elementType);
object list = Activator.CreateInstance(listType);
var addMethod = listType.GetMethod("Add");
addMethod.Invoke(list, new []{initialValue});
return list;
}
これによりList<T>
、実行時に不明なタイプ/オブジェクトから を作成できます。いくつかの使用法:
object intList = CreateList(typeof(int), 1);
object stringList = CreateList(typeof(string), "asdf");
object objectFromSomewhere = GetMyUnknownObject();
object someUnknownListType = CreateList(objectFromSomewhere.GetType(), objectFromSomewhere);
そのため、オブジェクトをそのままでは多くのことができない場合があります。IEnumerable
おそらく少なくともそれらを扱うことができたでしょう。しかし、それはあなたのシステムが何をする必要があるか次第です。
IList
編集:インターフェースを忘れました:
public IList CreateList(Type elementType, object initialValue)
{
if (!elementType.IsAssignableFrom(initialValue.GetType()))
throw new ArgumentException("Incompatible types!");
Type unboundType = typeof(List<>);
Type listType = unboundType.MakeGenericType(elementType);
IList list = (IList)Activator.CreateInstance(listType);
list.Add(initialValue);
return list;
}