1

文字列を型名に追加して別の型として渡すにはどうすればよいですか? 次に例を示します。

 public T Get<T>(int id)
        {
           return dbAccess.Get<T>(id);
        }

このメソッドを次のように呼び出すと

SomeObject.Get<Class1>(1234);

渡されたクラスに文字列 "Data" を追加して に変更Class1したいので、メソッドはオブジェクトをの変換として受け取ります。Class1DatadbAccess.GetClass1DataClass1

4

3 に答える 3

3

次のようなものが機能します。

public T Get<T>(int id)
    {
        var newTypeName = typeof(T).FullName + "Data";
        var newType = Type.GetType(newTypeName);
        var argTypes = new [] { newType };
        var method = GetType().GetMethod("Get");
        var typedMethod = method.MakeGenericMethod(argTypes);
        return (T) typedMethod.Invoke(this, new object[] { id });
    }

XxxData オブジェクトが Xxx から継承されていない場合は、結果を返す前に自動マッピングを実行する必要があります。

次に、最後の行を次のように置き換える必要があります。

        var dataResult = typedMethod.Invoke(this, new object[] { id });
        var result = new T(); // You will have to add a new() constraint on generic parameter
        // Map your dataResult object's values onto the result object's values
        return result;
于 2012-11-15T12:23:16.643 に答える
1

ジェネリック パラメータ T は、コンパイル時のパラメータです。つまり、コンパイラはコンパイル時にコードを前処理し、この時点で型が固定されます。

したがって、実行時に T に使用される型を変更することはできません。

型のセットが制限されている場合の 1 つのアプローチは、それぞれの呼び出しを設定してから、文字列に基づいてそれらを切り替えることです。

switch (str)
{
    case "":
        SomeObject.Get<Class1>(1234);
        break;

    case "Data":
        SomeObject.Get<Class1Data>(1234);
        break;
}

または、ジェネリックを完全に捨てて、代わりにリフレクションを使用することもできます。

于 2012-11-15T12:13:52.453 に答える
1

コンパイル時にすべての型パラメーターを認識している必要があるため、これは不可能です。両方の方法が一般的である限り、それについてできることは何もありません。

通常、この種の変換は、リフレクションとランタイム処理に切り替えることによって実行されます。たとえば、メソッドのシグネチャが である代わりに、 であるDbAccess.Get<T>(int)必要がありますDbAccess.Get(Type, int)

于 2012-11-15T12:22:49.233 に答える