gpt4 book ai didi

c# - 是否有一种 "cheap and easy"方法可以判断一个对象是否对特定类型实现了显式/隐式转换运算符?

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

最好用一个例子来说明:

class Cat
{
}

class Dog
{
public static implicit operator Cat(Dog d)
{
return new Cat();
}
}

我想知道,对于任意对象,我是否可以将它转换为 Cat。遗憾的是,我似乎无法使用 is/as 运算符。

void Main()
{
var d = new Dog();
if (d is Cat) throw new Exception("d is Cat");
var c1 = (Cat)d; // yes
//var c2 = d as Cat; // Won't compile: Cannot convert type 'Dog' to 'Cat' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

}

我希望避免 try/catch(InvalidCastException),因为我可能会经常这样做,而且这会非常昂贵。

有没有办法既便宜又容易地做到这一点?

编辑:感谢大家的回答 - 投票给所有人,希望我能给你所有的勾选,但最通用的解决方案将由 Marc 投票(奖励投票用于在iPod)。然而,Jordao 的解决方案设法磨练了我需要的东西,而不是我要求的东西,所以它可能就是我要用的东西。

最佳答案

is/as 不检查转换运算符。您需要使用反射来检查和调用上述运算符。我会写一个通用的静态类

static class Convert<TFrom,TTo> {}

然后在静态构造函数中检查该方法,使用 Delegate.CreateDelegate 创建一个

Func<TFrom,TTo>

并将其存储在静态字段中。然后您可以快速访问类型化方法:

public static TTo Convert(TFrom obj) { return del(obj); }
public static bool CanConvert { get { return del != null; } }
private static readonly Func<TFrom,TTo> del;

关于c# - 是否有一种 "cheap and easy"方法可以判断一个对象是否对特定类型实现了显式/隐式转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126217/

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