我的代码获取一个包含所有内容的对象。并且根据不同的需求,需要将其强制转换为不同的个人类型。
class A
{
public static explicit operator B (A value)
{
....
return new B();
}
}
class B
{
...
}
public static T Get<T>(...)
{
A a = new A();
return (T)A;
}
var b = Get<B>(...); // cannot convert a type of A to B
有什么想法吗?
答案 0 :(得分:4)
您无法执行此操作,因为编译器不知道(也无法告诉它)从A
到T
的转换。您需要以某种方式约束T
来表明这一点,而您却不能这样做-就像您不能约束T
拥有+
一样运算符等。(C#团队一直在考虑它的外观和实现方式,但是目前绝对不可用。)
您需要一种告诉编译器如何从A
转换为T
的方法-您可以向Get
添加参数来告诉它:
public static T Get<T>(Func<A, T> converter)
{
A a = new A();
return converter(a);
}
然后您将用以下方式调用它:
var b = Get<B>(a => (B) a);
例如。
答案 1 :(得分:-1)
C#不支持鸭子类型,但是您可以将类A序列化为json字符串,然后将其反序列化为类B,所有具有完全相同名称和类型的属性(或通过使用JSON属性或JSON设置)将根据需要进入B类。