2016-08-23 11 views
1

私は一般的な引数Tを持っています。これは特定の場合に配列です。 typeof(T).GetElementType()の配列にオブジェクトの配列をキャストすることは可能ですか?たとえば:配列を要素型にキャスト

public TResult Execute<TResult>()// MyClass[] in this particular case 
{ 
    var myArray = new List<object>() { ... }; //actual type of those objects is MyClass 
    Type entityType = typeof(TResult).GetElementType(); //MyClass 
    //casting to myArray to array of entityType 
    TResult result = ...; 
    return result;  
} 
+0

ありがとう、あなたの返事をありがとうが、問題は、メソッドの実行は、インターフェイスの実装だと私は署名を変更したり、新しいものを追加することはできません。 –

+0

私の答えの編集を参照してください – InBetween

答えて

2

これはお勧めできません。あなたはTResultを配列に束縛する方法がないので、現在のコードでは誰かがExcute<int>を呼び出してランタイム例外を得ることができます。

しかし、なぜ配列に拘束されるのですか?ただ、一般的なパラメータは、要素自体の種類も聞かせて:

public TResult[] Execute<TResult>() 
{ 
    var myArray = ... 
    return myArray.Cast<TResult>().ToArray(); 
} 

はUPDATE:あなたのコメントへの返信

Executeは、あなたが変更することはできませんインターフェイスメソッドである場合は、次の操作を行うことができます。

+0

ありがとう!それもうまくいく –

1

あなたはMyClassの配列を返すように拡張メソッドmyArray.Cast<MyClass>().ToArray()を使用することができます。

私はあなたにもTResult[]を返すことを意味すると思う:

public TResult[] Execute<TResult>()//MyClass[] in this particular case 
{ 
    return myArray.Cast<MyClass>().ToArray(); 
} 

あなたはこれらのメソッドを参照するために

using System.Linq; 

を追加する必要があります。

1

私はInBetweenとはよく似ていないことに同意しますが、私はあなたの文脈と、なぜこれが必要なのか分かりません。しかし、あなたがそのようにそれを達成することができます:

public TResult Execute<TResult>()// MyClass[] in this particular case 
{ 
    var myArray = new List<object>() { ... }; //actual type of those objects is MyClass 

    Type genericArgument = typeof(TResult); 
    if (!genericArgument.IsArray) 
     // what do you want to return now??? 

    Type elementType = genericArgument.GetElementType(); 

    MethodInfo cast = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(elementType); 
    MethodInfo toarray = typeof(Enumerable).GetMethod("ToArray").MakeGenericMethod(elementType); 

    object enumerable = cast.Invoke(null, new object[]{myArray}); 
    object array = toarray.Invoke(null, new object[]{enumerable}); 

    return (TResult)array; 
} 

これは、特定の一般的な引数のためのLINQの拡張機能を取得するためにreflectionを使用しています。問題は、TResultではない場合、このメソッドは何を返すべきか、の配列です。設計上の欠陥があるようです。

+0

ありがとう!私はすでに配列以外の 'TResult'(デフォルトの場合)の実装を持っていますので、すべてがうまく動作するはずです –

+0

これは本当に関係する必要はないと思います。 OPは基本的に参照変換を要求しています( 'object' - > * realUnderlyingType *)。このシナリオでは、 'Array.Copy'を使用することができます。私の答えをチェックしてください。 – InBetween

関連する問題