0

あなたのようなタイプオブジェクトが与えられた場合

var myType = typeof(SomeClass)

インターフェイスまたはクラスであり、ジェネリックで使用する元の型を取得することは可能ですか。

例えば

var myObject = container.Resolve<myType>()

したがって、この状況では SomeClass 型のオブジェクトが作成されます。

明確にするために、Ioc コンテナーの周りにラッパーを作成しようとしているので、他のコードに影響を与えることなく Ioc フレームワークを変更できます。

4

3 に答える 3

1

「元の型を取得する」という意味がまったく明確ではありませんが、ジェネリックで型を使用する場合は、通常、リフレクションを使用する必要があります。例えば:

var methodDefinition = container.GetType().GetMethod("Resolve");
var constructedMethod = methodDefinition.MakeGenericMethod(method);
object myObject = constructedMethod.Invoke(container, null);

変数の型は、myObject有用な場合にのみ使用できます。変数objectの型は、コンパイル時に既知である必要があります (ただし、一般的なものである可能性があります)。C# 4 および .NET 4+ を使用dynamicしている場合は、代替として使用できる可能性があります。後で何をしようとしているかによって異なります。

同じ型引数で複数のリフレクション呼び出しを行う必要がある場合は、ロジックを新しいジェネリック メソッドに抽出することを検討してください。その後、リフレクションを1 回使用してそのメソッドを呼び出し、メソッド内で通常のジェネリックを使用できます。

于 2012-09-27T05:54:51.177 に答える
1

ファミリのcontainer.Resolve1 つを意味する場合は、インスタンスを受け入れるoverloadがあります。UnityContainer.ResolveType

var obj = container.Resolve(typeObj);

これは、DI または IoC コンテナーの一般的な機能であり、一般的なユース ケースと非一般的なユース ケースの結合された解決のオーバーロードを持ちます。

于 2012-09-27T06:04:10.180 に答える
0

次のようなものが必要だと思います。

T Resolve<T>()
{
    var myType = typeof(T);
    return (T)myType.GetConstructor(new Type[] { }).Invoke(new object[] { });
}

そして、あなたはそれを使用します:

YourClass l = Resolve<YourClass>();

これは、次のようなパラメーターのないコンストラクターの非常に単純な例です。

public YourClass(){...}

ここここから読み始めることができます

そして、反省が必要かどうかにかかわらず、常に徹底的に検討する必要があります (J.Skeet の回答を考慮してください)。

于 2012-09-27T05:59:02.830 に答える