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

Ben*_*dgi 1 c# generics types

我试图创建一个函数,其中返回类型在运行时确定.我知道我可以返回一个object或者dynamic,但是我的目标是让object返回的类型,并被编译器和InteliSense识别.

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

这是我正在尝试创建的一个示例

注意:我实际上并不想要Buttons和Grids ......这只是用于这个例子.

Type T;
public T Question(bool aBool)
{
    if (aBool)
    {
        T = typeof(Button);
        return new Button();
    }
    else
    {
        T = typeof(Grid);
        return new Grid();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ser*_*rvy 6

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

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

public T Foo<T>()
    where T : new()
{
   return new T();
}
Run Code Online (Sandbox Code Playgroud)

这真的是真正动态返回类型的唯一可用选项,它具有很多真正有用的潜力.

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