是否有CTypeDynamic的C#版本?

时间:2010-07-12 19:26:31

标签: c# vb.net dynamic .net-4.0

来自文档:

  

CTypeDynamic方法根据对象本身定义的转换语义应用动态转换。如果动态对象继承自DynamicObject,则CTypeDynamic方法首先尝试使用用户定义的静态转换来执行转换。如果用户定义的静态转换失败,CTypeDynamic方法将尝试使用动态转换执行转换。如果动态对象实现IDynamicMetaObjectProvider,则CTypeDynamic方法优先于通过用户定义的静态转换进行动态转换。

C#中有什么东西可以做到这一点吗?或者我只需导入包含它的VB库。

5 个答案:

答案 0 :(得分:3)

如果你使用C#4.0那么是的,称为动态。 Here is the link

答案 1 :(得分:2)

您无需为此导入VB库。

如果在DynamicObject派生类中重写TryConvert,那么C#允许您通过隐式或显式转换隐式调用它。

//explicit conversion
String myObject = (String)myDynObject;

//implicit conversion
String myObject = myDynObject;

VB.NET仅支持显式转换。 C#支持隐式和显式。

以下是MSDN的link

希望这有帮助!

答案 2 :(得分:0)

我猜第一次投射到动态,然后到目标类型应该做的伎俩 动态在C#4.0 / VS 2010中可用

在C#3.0 / VS2008中,您可能可以使用表达式。如果我没记错的话,“MiscUtil”库包含在其泛型运算符类中使用转换运算符的函数。

答案 3 :(得分:0)

简短回答

您无需导入任何内容。只需使用隐式和显式C#转换和“动态”关键字。 D Hoerster的回答是正确的。

答案很长

C#有一个单独的类型来处理动态对象 - 类型是“动态的”。但是在VB中没有专门的类型,因为动态行为是通过后期绑定实现的。因此,在VB中,需要真正动态绑定的动态对象有时难以与“对象”区分开来。 CType处理“对象”到类型的转换。在大多数情况下,它很好。但是,当您处理IDynamicMetaObjectProvider接口的实现时,它可能会导致麻烦。 CType无法理解它是处理“对象”还是“动态对象” - 没有语法可以区分彼此,CType不希望为通过后期绑定定义的所有对象调用动态绑定器。它假定它处理的所有对象都是“对象”,而不是“动态对象”。 因此,您需要以某种方式让编译器知道您正在处理动态对象。 VB团队决定只添加一个转换函数 - CTypeDynamic,而不是创建新的“动态”类型。它明确告诉编译器您正在将动态类型转换为其他类型(同样,在C#中您不需要这样,因为您已经使用dynamic关键字定义了对象,并且编译器已经知道它处理的内容)。 / p>

问题的一个很好的例证是DynamicObject.TryConvert方法。尝试在VB示例中用CType替换CTypeDynamic,您将看到异常。同样,这是因为CType对动态运行时绑定器一无所知。但是在C#中,为dynamic关键字定义的所有对象调用运行时绑定程序,因此它不需要这个特殊的函数。

答案 4 :(得分:0)

VB' CTypeDynamic()的C#等效函数是Convert.ChangeType()

名称的更改有助于将C#函数区分为根据类型变量在运行时设置类型转换,而不是关于dynamic类型机制。

Convert.ChangeType

  

返回指定类型的对象,其值等于指定的对象。

Conversion.CTypeDynamic

  

将对象转换为指定的类型。

...

  

CTypeDynamic方法将作为Expression参数传递的对象转换为TargetType参数指定的类型。如果对象是动态对象,则CTypeDynamic方法应用可用的动态转换。

...

  

CTypeDynamic方法首先尝试使用执行转换   用户定义的静态转换

相关问题