2011-01-13 17 views
0

私はタイプとオブジェクト例えば:ジェネリック型キャスト

- Type someType (coming from somewhere, could be any class eg. MyClass.GetType()) 
- Object someObject (eg. List<MyClass>()) 

を持っており、バックList<MyClass>にオブジェクトをキャストします。私はどのようにこれを行う必要がありますか?

+5

あなたの質問は理にかなっていません。達成しようとしている。 – SLaks

答えて

1

これはできません。 Genericsはコンパイル時の安全性を確保します。実行時にのみ実際の型を知っているので、コンパイル時の安全性を保つことはできません。

0

実行時の型があり、コンパイル時のキャストを実行する必要があります。これは不可能です。なぜこれを最初にやりたいのかは明らかではありません。 reflectionが必要な症例に興味がある場合は、そのトピックをさらに調査する必要があります。

0

実行時にタイプ情報のみを受け取ったときにコンパイル時に変数をタイプする方法はありません。

ジェネリック医薬品に使用すると、コンパイル時に型情報を取得するので、これはジェネリック医薬品とは異なります。

void MyFunc<T>(T thing) 
{ 
    // T is passed in at compile time 
} 

あなたのケースでは、実行時にタイプを取得しています。あなたがタイプへの道をメンバーをキャストすることはできませんしながら、あなたは通常、あなたは、インスタンスに反映し、そのメンバーを呼び出すことができます:

void MyFunc(object thing, Type type) 
{ 
    var res = t.GetMethod("Add").Invoke(a, new []{"someArg"}); 
} 
0

キャストは明示的に変換するタイプを指定することを意味します。あなたのタイプが何であるか分からないので、あなたはそのタイプにキャストできません。

これは、あなたがリストにアクセスできないというわけではありません。あなたは問題にあなたを記述する場合は「

object obj = GetMyList(); 
IList list = (IList)obj; 
object fifthItem = list[4]; 
list.RemoveAt(list.Count - 1); 

:あなたが持っている物が何かのリストであることがわかっている場合、あなたが必要なメソッドとプロパティのほとんどを提供する非ジェネリックIListインタフェース、それをキャストすることができます達成しようとしているソリューションではなく、解決しようとしている場合は、より合理的なソリューションが掲載される可能性があります。

0

コンパイル時に実行時の型をキャストしようとしている場合は、私の前で述べたように不可能です。
は しかし、あなたが少しをごまかすことができます(ただし過度にこの手法を使用していない、それは...暗い道をリード)

public void DoSomething<T>(List<T> object) where T : .... 
{ 
//do what you want here 
} 

public void CallIt(Type t, object o) //o is List<Foo> 
{ 
this.GetType().GetMethod("DoSomething").MakeGenericMethod(t).Invoke(o); 
} 

かのように私は、これまで任意の真のメリットが表示されていないがオブジェクトやIListインターフェイスの代わりにジェネリックを使用することで何も得られない型制約を記述する必要はありません。また、そこにベースクラスまたはインターフェイスを記述すれば、そのオブジェクトをキャストできます。たとえば、TがIFooを実装していることがわかっている場合は、IList <IFoo>にすべてのメリットを与えることができます。リスト<Foo>

関連する問題