将动态转换为var

时间:2012-11-19 12:06:54

标签: c# .net dynamic casting var

我有以下代码:

public class Processor
{
    private Query _query = 
        new SpecificQuery1();
    //OR
      //new SpecificQuery2();

   public void ProcessItem(dynamic dynamicResult)
   {
        //Can't use intellisense on dynamicResult

        var staticResult = dynamicResult as _query.GetSomeType();//Can't do it :(

        //Can use intellisense on staticResult
   }
}

并且,令人惊讶的是,它没有编译。有什么方法可以将动态变成var吗?我知道这听起来很疯狂,但是这部分将被编辑很多,如果有人更改了QueryImplementation,他还必须更改ProcessItem()中的类型。我想将步骤数减少到1 - 只需替换SpecificQuery(),类型就会自行改变。

所以让我改写一下。我想知道如何根据哪个构造函数分配给基类Query,如何在dynamicResult(或其中某些转换)上使用intellisense。

由于

编辑: 对不起,我可能不正确地问了。我理解什么是动态和var。      我并不打算在动态上使用intellisense。      我并不打算真正将动态转换为var。

我想说的是,如果我有编译时知道动态将是什么类型(它存储在Query实现中 - 它可以是静态的,const我想要的任何东西) - 我有什么方法可以使用这些知识在ProcessItem()中启用intellisense?

4 个答案:

答案 0 :(得分:4)

var上下文关键字只是语法糖。没有必要对其进行“强制转换”,因为用它声明的变量已经是强类型的。

如果函数结果的类型是dynamic,那么用var声明的变量也是如此。

staticResult的类型为dynamic

var staticResult = dynamicResult;

您无法在dynamic类型上获得智能感知。如果您知道您将获得的类型,然后投射到它 - 这将使您能够访问intellisense。

var staticResult = (myType)dynamicResult;

请注意,上述内容很容易导致运行时错误和异常,从而导致进程崩溃。

答案 1 :(得分:2)

请参阅this SO answer详细解释vardynamic之间的区别,根据您的问题,您应该知道编译器会知道var的类型在编译时,dynamic 只能在运行时确定;因此,您无法将从dynamic(在运行时确定)的类型转换为var(在编译时确定)。

那么,为什么不让它保持动态呢?

答案 2 :(得分:2)

不,你不能做那样的事。

首先,由于var不是类型,因此无法向var投射内容。此外,铸造只能用于静态知道的类型;这意味着您要转换的类型必须是硬编码的,并且不能是评估表达式的结果(例如示例中的方法调用_query.GetSomeType())。

答案 3 :(得分:1)

你可以实现像

这样的东西
public abstract class AbstractQuery
{
     AbstractQuery Create(dynamic result);
}
public class SpecificQuery1 : AbstractQuery
{
    new public SpecificQuery1 Create(dynamic result)
    {
       ...
    }
}

public void ProcessItem(dynamic dynamicResult)
{
    var staticResult = _query.Create(dynamicResult);
}

从动态转换为类型化结果