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); }

但是诸如stringetc 之类的默认值为 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,那将起作用-但这只会推迟您的问题。

另一种选择是声明output为基类或接口并将泛型限制T为。object用作基类可能对您有用 - 取决于您想用它做什么。

于 2013-03-06T12:42:26.767 回答