有2个班
class Class1
{
}
class Class2
{
public static explicit operator Class2(Class1 value)
{
return new Class2();
}
public static implicit operator Class1(Class2 value)
{
return new Class1();
}
}
我们有两个类的类型对象。
我们需要一个可以双向转换的通用方法(expression、emit ...)
例子:
//метод конвертации. Возвращает object ибо у нас нет T
public object Convert(object source, Type targetType){
//тут происходит преобразование source в Type
//source и type связаны expicit/implicit
}
var obj1=new Class1();
var obj2=Convert(obj1, typeof(Class2));
и наоборот
var obj1=new Class2();
var obj2=Convert(obj1, typeof(Class1));
explicit 和 implicit 在同一个类中定义,但是用它们进行强制转换是双向的。
已知的是:
- Convert.ChangeType 需要 IConvertible 接口的实现,这是不合适的
- C 反射是可以的,但是很慢。
来自“如何做”类别的任务。您需要了解转换的结果将是所需的类型,但会强制转换为对象。并且在其他地方需要明确的演员表。但是我们面临着为隐式/显式运算符 c 类型进行“转换”的任务。
我们有现成的类型,没有 T 泛型。
为了解决这个问题,我们采用泛型方法
从中,使用反射,您可以创建具有特定类型的方法。
然后您可以调用 Invoke 并获得所需的结果
慢慢地,所以我们做代码生成。
Expressions.Convert 不能解决问题。
一个小测试对象的计时。
ps:如果有T,那么就可以使用Expressions.Convert,在这个例子中它会给出16 ns的值。