0

私はインターフェースを持っています:

public interface IOut<T>
{
    void Get(out T output);
}

およびそれを実装するクラス:

public class Impl : IOut<string>, IOut<int>{
    public void Get(out string output) { output = "string"; }
    public void Get(out int output) { output = 12; }
}

私は次のことをうまく行うことができます:

public static void Main()
{
    dynamic dImpl = new Impl();

    string sOutput;
    int iOutput;

    dImpl.Get(out sOutput);
    dImpl.Get(out iOutput);

    Console.WriteLine(sOutput);
    Console.WriteLine(iOutput);
}

私の問題は、実行時に取得する必要がある型しか知らないことです。そのため、コードを呼び出す方法は次のようになります。Get

public static void Main()
{
    dynamic dImpl = new Impl();

    var t = typeof(string);
    t output;
    dImpl.Get(out output);

    Console.WriteLine(output);
}

さて、これがうまくいかないことはわかっています。反射的にキャストを実行してみました。

public static T Cast<T>(object o) { return (T) o; }

しかし、キャストするオブジェクトがありませんType。デフォルトを試しました:

public static T Default<T>() { return default(T); }

しかし、etc などのデフォルトstringは null であり、リフレクションを介してメソッドを呼び出す場合:

var method = typeof(Program).GetMethod("Default").MakeGenericMethod(typeof(string));
var defaulted = method.Invoke(null, null);

defaultedは null になりdImpl.Get(out defaulted)、ランタイムを呼び出すときに、使用するオーバーロードが不明です。

だから、私が探しているのは、次のいずれかです:a)何らかの方法で現在のインターフェース設定を使用してこれを行う[推奨] b)目標を達成するための別の方法

4

2 に答える 2

2

実装する型ではなく、インターフェイスの型から呼び出すメソッドを取得できます。

object[] parameters = new object[] { null };
Type typeParam = typeof(string);
Type ifaceType = typeof(IOut<>).MakeGenericType(typeParam);
MethodInfo method = ifaceType.GetMethod("Get");

var impl = new Impl();
method.Invoke(impl, parameters);

object outParam = parameters[0];
于 2013-03-06T12:47:22.863 に答える
0

の型が実行時までわからない場合output、C# で厳密に型指定されたインスタンスを宣言することはできません。

呼び出しロジック(Mainあなたの例では)もジェネリックにすることができればT、それは機能しますが、これは問題を遅らせるだけです。

もう 1 つのオプションはoutput、基本クラスまたはインターフェイスとして宣言し、ジェネリックTをそれに制限することです。基本クラスとして使用objectするとうまくいくかもしれません-それで何をしたいかによって異なります。

于 2013-03-06T12:42:26.767 に答える