C# 有CTypeDynamic的C版本吗?

C# 有CTypeDynamic的C版本吗?,c#,vb.net,dynamic,.net-4.0,C#,Vb.net,Dynamic,.net 4.0,从文件中: CTypeDynamic方法根据对象本身定义的转换语义应用动态转换。如果动态对象继承自DynamicObject,则CTypeDynamic方法首先尝试使用用户定义的静态转换来执行转换。如果用户定义的静态转换失败,CTypeDynamic方法将尝试使用动态转换执行转换。如果动态对象实现了IDynamicMetaObjectProvider,则CTypeDynamic方法将动态转换优先于用户定义的静态转换 C#中有什么东西能做到这一点吗?或者我只需要导入拥有它的VB库。如果您使用C#4

从文件中:

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


C#中有什么东西能做到这一点吗?或者我只需要导入拥有它的VB库。

如果您使用C#4.0,那么是的,称为动态

不需要为此导入VB库

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

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

//implicit conversion
String myObject = myDynObject;
VB.NET仅支持显式转换。C#支持隐式和显式

以下是MSDN关于此的详细信息


希望这有帮助

我猜先向dynamic施放,然后再向target类型施放应该可以达到目的。
Dynamic在C#4.0/VS 2010中提供


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

简短回答

你不需要导入任何东西。只需使用隐式和显式C#转换和“dynamic”关键字。霍斯特的回答是正确的

长答案

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

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

与VB的
CTypeDynamic()等价的C函数是

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

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

将对象转换为指定的类型

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

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


是的,这对我找到的CTypeDyamic示例很有用。仍然想知道它是否“是”相同。它实现了IDynamicMetaObjectProvider,因此也适合您的需要。它不完全相同,因为C使用了C运行时绑定器,VB使用VB运行时绑定器。结果是,它们都在处理动态对象时使用DLR约定。考虑到VB开发人员只会在后期绑定代码中使用Option Strict Off,我想这是有道理的。我不像C#dev那样是VB.NET开发人员,但这是有道理的。传递给CTypeDynamic的对象必须实现IConvertible接口-这限制了这种方法的实用性。另外,C#中的'dynamic'关键字(正如其他人所指出的),您甚至不需要有与CTypeDynamic等价的工具。@DaveDoknjas我想您的意思是ChangeType需要IConvertible(而不是CTypeDynamic)。对我来说,这似乎是标准的课程,而不是一个严重的限制…另外,除非我对动态类型的理解是错误的,否则它不会提供相同的功能。它不提供基于
type
类型的参数的运行时转换,或者换句话说,不提供显式转换,但类型将由运行时的
type
变量确定。例如,甚至没有提到动态类型。是的,这是一个错误,应该是“传递给ChangeType的对象必须实现IConvertible接口”。