将对象转换为方法泛型类型

时间:2016-02-25 14:20:37

标签: c# generics

这会产生错误,说我无法转换 ClassType 类型  到T。有没有解决方法呢?

有没有办法指定this 的类型实际上可以转换为T

public void WorkWith<T>(Action<T> method)
{
    method.Invoke((T)this);
}

2 个答案:

答案 0 :(得分:3)

public void WorkWith<T>(Action<T> method) where T: ClassType    {
    method.Invoke((T)this);
}

答案 1 :(得分:3)

两种可能的解决方案:

不是类型安全的:

public void WorkWith<T>(Action<T> method)
{
    method.Invoke((T)(object)this);
}

这不是类型安全的,因为您可以传递任何具有单个参数且没有返回值的方法,例如:

WorkWith((string x) => Console.WriteLine(x));

typesafe“version”(使用通用约束):

public class MyClass
{
    public void WorkWith<T>(Action<T> method) where T : MyClass
    {
        method.Invoke((T)this);
    }
}

这里的要点是,为了能够this转换为T,编译器希望确保this始终可以转换为T(因此需要对于约束)。如非类型安全示例所示,与泛型一起使用的“经典”(不安全)解决方案是通过强制转换为object