私はインターフェースを持っています:
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)目標を達成するための別の方法