2014-03-05 37 views
0

我正在试图创建一个函数,其中返回类型是在运行时确定的。我知道我只能返回一个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已经为许多其他事情做到了这一点。虽然这些东西可能很简单,例如检测不可达代码或绘制可视化预览。如果这是一个实现的功能,我很好奇。

+0

不清楚你想达到的目标。它感觉你希望编译器通过预测未来一段时间的代码执行结果来实现魔法:“返回类型在运行时确定......由编译器识别”。 –

+2

直到运行时才解析,编译器如何确定inteliSense的类型?这只是没有意义。 –

+0

即使使用泛型,编译器仍然需要能够在编译时确定类型。这听起来像是你在这里有一个糟糕的抽象,也许如果我们知道你正在试图解决什么问题,我们可以建议一个更好的行动...... – David

回答

6

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

对于在编写方法时某种类型未知的方法有一个特定功能,但在对该方法进行特定调用时会得到修复。该功能被称为“泛型”。

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

这真的是为有真正是有用巨大的潜力真正动态返回类型唯一可用的选项。

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

0

如果它有一个无参数构造函数并且用new constraint标记泛型,则可以使用该类型。如果你想要做的不仅仅是它变得更加困难,你需要使用反射或激活剂。

0

您可以在此情况下

如使用动态关键字:

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

我知道我可以使用'Dynamic',但是它必须在消费者一方投射,我正在寻找一种方法来避免这种情况。 – BenVlodgi