C# 如何转换为未知类型,需要转换为GenericType,但T是未知的

C# 如何转换为未知类型,需要转换为GenericType,但T是未知的,c#,reflection,interface,casting,C#,Reflection,Interface,Casting,我需要从一个我不知道类型的对象调用方法DeepClone() object x = GetObject(); var x2 = x as IDeepCloneable< ?????? >;//What can I do here??? var clone = x2.DeepClone(); public interface IDeepCloneable<T> { T DeepClone(); } 但是在这种情况下,我需要更改T DeepClone()派生接口的

我需要从一个我不知道类型的对象调用方法DeepClone()

object x = GetObject();
var x2 = x as IDeepCloneable< ?????? >;//What can I do here???
var clone = x2.DeepClone();

public interface IDeepCloneable<T>
{
    T DeepClone();
}

但是在这种情况下,我需要更改T DeepClone()派生接口的方法;到新的T DeepClone();。因此,所有已经实现IDeepCloneable的类都不会编译。

您想要一个协变接口:

public interface IDeepCloneable<out T>
{
    T DeepClone();
}
public接口IDeepCloneable
{
T深克隆();
}
然后,您可以在C#4.0中强制转换为
idepcloneable

dynamic
关键字允许您通过暂停类型检查直到运行时来解决此问题:

dynamic x = GetObject();
var clone = x.DeepClone();

只要在
x

上有一个方法
DeepClone()
,就可以正常工作。如果您在.NET 4.0中,只需使用
dynamic
即可this@Servy我已经做到了。。。你也可以在这里使用。。。它将允许您在运行时对泛型进行专门化,并将其分配给动态。你的回答我不清楚。编译错误:类型“object”不能用作泛型类型或方法“My.idepcloneable”中的类型参数“T”。没有从“object”到“My.idepCloneable”的隐式引用转换,因为object不是
idepCloneable
-您必须在您想要深度可克隆的对象上实现接口使用原始示例,他意味着您可以执行如下操作:var x=GetObject()as idepCloneable;var clone=x.DeepClone()。。。假设
x
具有某种形式的运行时类型
IDeepCloneable
。但是“as IDeepCloneable”并不是编译的一对耦合点:(1)其中T:IDeepCloneable约束似乎没有必要,如果省略它,示例应该可以工作;(2) 如果运行时类型
T
是值类型(struct),则此操作将不起作用。换句话说,如果
x
的运行时类型为
struct MyCloneable:IDeepCloneable{…}
,则无法将
x
强制转换为
IDeepCloneable
。仅使用
DeepClone
返回
object
,实际上没有什么好处。使用非泛型接口甚至可以提供比这更大的编译时类型安全性,而不会限制所需的任何功能;它会导致成员绑定延迟到运行时。绑定将使用通常在编译时强制执行的相同规则来应用。关键的区别在于,成员将被绑定到运行时类型
x
,这在编译时是未知的,事实上,如果为不同的运行时类型
x
@Servy调用代码,它可能会被绑定多次。您在这里得到的是,您可能不知道
T
是什么,就像我说的。。。我以前不得不在运行时生成的类型上这样做,虽然不好玩,但它很有效。@MikeStrobel这听起来很像在编译时暂停类型检查…@Mgetz,这就是为什么我说使用非泛型接口没有任何好处。如果您使用的是非通用接口,那么您就没有需要知道接口类型的
t
dynamic x = GetObject();
var clone = x.DeepClone();