2

コードを簡略化しましたが、基本的にこのコードはループで実行され、型はリフレクションから取得されます。ここでの唯一の定数はIWorker<T>インターフェイスです。

のプロパティにアクセスする必要がありますが、コンパイラによって受け入れられないIWorkerため、キャストできません。アイデアはありますか?argType

(私は動的にこれを行うことができましたが、リファクタリングによる将来のバグを防ぐための代替手段を望んでいました)

Type argType = @interface.GetGenericArguments().First();

var worker = (IWorker<argType>)FormatterServices.GetUninitializedObject(MyType);

MyTypeコンパイル時に不明なIWorker<T>場所から派生します。T

4

2 に答える 2

2

可能であれば、メソッドをジェネリックにする必要があります。これは、コンパイル時の型の安全性を維持できる唯一の方法です。これがオプションではなく、このメソッドがTypeパラメーターを直接受け入れる必要がある場合、最終的に使用するソリューションは、定義により、静的型付けを維持できません。

public static IWorker<T> Foo<T>()
{
    return (IWorker<T>)FormatterServices.GetUninitializedObject(typeof(T));
}

次に、次のように呼び出すことができます。

IWorker<ArgType> worker = Foo<ArgType>();
于 2013-06-12T18:25:33.667 に答える
1

私はあなたがそれをすることができないことを恐れています。ジェネリック型パラメーターは、コンパイル時に認識されている必要があります。型キャストも、コンパイル時に認識されている必要があります。ほとんど2つのオプションがあります:

  1. 一般的な方法を使用してください(Servyの回答を参照)。

  2. 非ジェネリック インターフェイスを作成し、それをIWorker<T>継承します。

    public interface IWorker 
    { 
        string MyProperty { get; }
    }
    
    public interface IWorker<T> : IWorker
    {
        ...
    }
    

    次に、次のように使用できます。

    var worker = (IWorker)FormatterServices.GetUninitializedObject(MyType);
    worker.MyProperty = "Somwthing";
    
于 2013-06-12T18:29:33.407 に答える