0

我有以下代码:

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(或其中的一些强制转换)上使用智能感知。

谢谢

编辑:对不起,我可能问错了。我明白什么是动态和可变的。我不打算在动态上使用智能感知。我并不打算真正将动态转换为 var。

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

4

4 回答 4

4

var上下文关键字只是语法糖。不需要向它“强制转换”任何东西,因为用它声明的变量已经是强类型的。

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

staticResult是类型dynamic

var staticResult = dynamicResult;

您无法在dynamic类型上获得智能感知。如果您知道您将获得的类型,然后转换为它 - 这将使您可以访问智能感知。

var staticResult = (myType)dynamicResult;

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

于 2012-11-19T12:10:23.287 回答
2

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

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

于 2012-11-19T12:10:37.670 回答
2

不,你不能做那样的事情。

首先,您不能将某些内容转换为,var因为var它不是类型。此外,只能对静态已知的类型进行强制转换;这意味着您要转换的类型必须是硬编码的,并且不能是评估表达式的结果(例如_query.GetSomeType()您的示例中的方法调用)。

于 2012-11-19T12:11:08.103 回答
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);
}

从动态转换为类型化结果

于 2012-11-19T12:17:08.107 回答