gpt4 book ai didi

C# Dynamics : Convert. ChangeType 与 Cast

转载 作者:太空狗 更新时间:2023-10-29 17:43:21 27 4
gpt4 key购买 nike

有人可以解释为什么将动态对象转换为类会返回该类,而使用 Convert.ChangeType 会返回动态对象,尤其是在运行时?例如:

 dynamic dObject = new SomeClass();
var dTest1 = dObject as SomeClass; // returns SomeClass
var dTest2 = Convert.ChangeType(dObject, typeof(SomeClass)); // returns dynamic

更广泛的问题:我有一系列实现通用接口(interface)的辅助类。我需要将这些类的列表传递给其他对象;然而,不同的帮助类使用不同类型的泛型参数,所以我不能直接传递帮助类的列表:

interface IHelper<T>
{
IEnumerable<T> Foo();
}
var HelperList = new List<IHelper<T>> // Can't do this because T varies from helper to helper!

所以我认为我可以通过创建一个容器类来伪造运行时,该容器类包含辅助类和泛型类型,但利用了动态:

class ContainerClass
{
IHelper<dynamic> HelperClass;
Type dType; // Specifies the type for the dynamic object
}

现在我可以创建并传递一个 ContainerClass 列表。所有处理工作都很好,直到我需要将 Foo() 的结果分配回目标 IEnumerables,此时我收到运行时错误,指出类型对象无法转换为这样那样的具体类,即使未装箱的对象类型匹配那些需要的。如果我尝试与上面的 dTest2 中类似的语法,运行时仍然无法计算出“转换”。

我意识到这可能是对动态和不良编程习惯的滥用。如果我能找到一个不同的解决方案,我肯定会使用不同的解决方案,但现在我要么需要完成这项工作,要么选择不那么雄心勃勃的东西。

最佳答案

在执行时,没有 dynamic 这样的东西真的。

但是,调用Convert.ChangeType正在提供 dynamic值作为参数。 任何 使用 dynamic 的方法调用参数被视为具有 dynamic 的返回值,因为编译器直到执行时才知道实际签名是什么。

但是,如果您使用强制转换,则 isas表达式或构造函数调用结果只能是一个类型 - 所以这就是表达式的类型。

至于你的更广泛的问题 - 我不清楚使用 dynamic会特别帮助你。您可能想为 IHelper<T> 声明一个基本接口(interface)- 一个非通用接口(interface),仅用于实际 IHelper<T>实例。然后你可以有一个List<IHelper>其中每个元素实际上都是一个IHelper<T>对于一些 T , 但带有 T因实例而异。 IHelper接口(interface)在这里并不是真的需要,尽管如果你的IHelper<T>接口(interface)确实包含其他不使用的成员 T , 那些可以移动到 IHelper反而。但是,只是为了清楚起见而使用它可能会有用。

现在,当您需要使用特定的 IHelper 时, then 动态类型可能会暂时有用。您可以声明一个泛型方法,让动态类型在执行时确定类型参数。例如:

private readonly IList<IHelper> helpers;

...

public void UseHelpers()
{
foreach (dynamic helper in helpers)
{
UseHelper(helper); // Figures out type arguments itself
}
}

private void UseHelper<T>(IHelper<T> helper)
{
// Now you're in a generic method, so can use T appropriately
}

关于C# Dynamics : Convert. ChangeType 与 Cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com