gpt4 book ai didi

c# - 类型转换的通用方法

转载 作者:IT王子 更新时间:2023-10-29 04:33:55 27 4
gpt4 key购买 nike

我正在尝试编写通用方法来转换类型。我想写类似 Cast.To<Type>(variable) 的东西而不是 (Type) variable .我对此方法的错误版本:

public class Cast
{
public static T To<T>(object o)
{
return (T) o;
}
}

这是一个简单的测试:

public class A
{
public static explicit operator B(A a)
{
return new B();
}
}

public class B
{
}

A a = new A();
B b = Cast.To<B>(a);

如您所料,此代码将失败并返回 InvalidCastException .

这段代码失败是因为虚拟机不知道如何转换类型为object的变量吗?输入 B在运行时?但是异常消息说:“无法将类型 A 的对象转换为类型 B”。所以 CLR 知道变量的真实类型 o , 为什么它不能执行转换?

这里是主要问题:我应该如何重写方法 T To<T>(object o)解决这个问题?

最佳答案

所有关于运算符(operator)分辨率的说法都是正确的......但这是我对你的主要问题的回答:

    public static T To<T>(this object o)
{
return (T)(dynamic)o;
}

这里的关键是将 o 强制转换为 dynamic 将强制 .NET 在运行时搜索显式运算符。

另外,为什么不把它变成一个扩展方法呢?

代替

        A a = new A();
B b = Cast.To<B>(a);

你可以做到

        A a = new A();
B b = a.To<B>();

将其公开为扩展方法的另一个好处是,您可以获得一个用于显式转换的流畅接口(interface)(如果您喜欢那种东西)。我一直讨厌在 .NET 中显式转换所需的嵌套括号平衡量。

所以你可以这样做:

a.To<B>().DoSomething().To<C>().DoSomethingElse() 

代替

((C)((B)a).DoSomething())).DoSomethingElse()

在我看来,这看起来更清晰。

关于c# - 类型转换的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795402/

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