在函数中动态创建或设置函数的返回类型

时间:2014-03-05 20:06:46

标签: c# generics types

我正在尝试创建一个在运行时确定返回类型的函数。我知道我可以返回objectdynamic,但我的目标是返回已键入的object,并由编译器和InteliSense识别。

我知道我可以在返回之后投射我的object,这将是最容易实现的,但这不是编程精神。

以下是我正在尝试创建

的示例

注意:我实际上并不想要按钮和网格...这只适用于此示例。

Type T;
public T Question(bool aBool)
{
    if (aBool)
    {
        T = typeof(Button);
        return new Button();
    }
    else
    {
        T = typeof(Grid);
        return new Grid();
    }
}

现在,这显然不起作用,我理解为什么。但我想知道是否有人有办法可行,或者当C#的当前状态无法实现这一点。

编辑:对评论的回应......我理解这看起来像“神奇”,我明白编译器必须弄清楚我的结果是什么才能起作用。编译器/ Intellisense / Visual Studio已经为许多其他事情做了这件事。虽然这些事情很简单,例如检测无法访问的代码或绘制视觉预览。我很好奇这是否是一个实现的功能。

3 个答案:

答案 0 :(得分:6)

这种方法的使用者唯一可能实际依赖于返回类型是动态的事实的方法是,至少对于那个方法调用,返回类型在编译时是静态已知的。

对于在编写方法时某些类型未知的方法,有一个特定的功能,但在对该方法的特定调用是make时修复。该功能称为“泛型”。

public T Foo<T>()
    where T : new()
{
   return new T();
}

这是真正动态返回类型的唯一可用选项,它有很大的潜力可以实现有用

如果这不是您想要的,或者对您来说这不是一个可行的选项,那么赔率非常高,您的方法不应该有动态更改的返回类型。相反,它应该有一个固定的返回类型,可以有多个通用类型,可以有多个实现。通常这意味着一个接口,您可以返回任意数量的可能实现之一。如果调用者不需要真正了解或关心实现是什么,则应该这样做,但他们需要知道的是,他们被给予了一些接口的实现,这些接口公开了他们所需要的所有内容。在你的情况下,如果调用者只需要知道他们被赋予某种类型的控制权,并且Control的API提供了他们需要做的所有事情,那么Control之类的东西可能是可行的。用它。

答案 1 :(得分:1)

在这种情况下,您可以使用动态关键字

例如:

public dynamic CreatObj(string caller)
{
    if (caller.equals("x"))
        return x;
    else
        return y;
}

答案 2 :(得分:0)

如果类型具有无参数构造函数,并且使用new constraint标记通用,则可以使用该类型。如果你想做更多的事情,你需要使用反射或激活剂变得更加困难。