如何通过泛型类型进行转换

时间:2013-02-07 21:42:48

标签: c# generics casting abstract-class

我想使用通用类型进行投射,有没有简单的方法可以做到这一点?这是一个例子:

var resource = viewBase.getAnyInstance(resourceName) as T;

其中T是现有类型之一。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

Generic是处理多种类型Objects的一种奇特方式,没有任何明确的操作知识。这本身就会产生相当大的灵活性,因为它可以缓解您在使用BoxingUnboxing时可能遇到的几个问题。

为了帮助您澄清Generics,我将使用List示例。主要是因为至少对我来说,CastingGenerics确实固化了。

问题是,如果您在Cast之间尝试List Generics,您很快就会看到......您不能。

在我的例子中,我将使用Shapes,所以理论上你有三个类。

类:

  • 多边形

当你学会Casting时,这很容易做到。

int i = 10;
string j = "I have ";
string d = j + (string)i;

您已将variable i转换为String。只要类型适合;你没关系如果没有,你会遇到异常。

当您介绍Generics时,它会快速变化。

现在,如上所述,我们有三个Classes代表Shapes。现在,Shape将是一个公共Object,技术上应由Shapes继承。因此List<Square>无法继承List<Circle>,反之亦然。看似量化,似乎有道理。但事实并非如此?

这是由于Constructed Type发生了数据转换。

因此,在某些情况下,对于这些List,您必须编写Loop来将数据从一个List传输到另一个Generics

所以这就是// Square List: List<Square> lSq = new List<Square>(); lSq.Add(new Square("Red Square")); lSq.Add(new Square("Blue Square")); 非常有用的地方。

Square List

我们创建了一个// Generic Shape List<Shape> shp = lSq.ConvertAll( new Converter<Square, Shape>(lSqToshp)); 来保存我们的对象。

Generic

我们实际上已将Cast List个值直接用于我们的新Abstract Class

现在,我明白这不是你的问题。你问:

  

我想使用通用类型进行投射,有没有简单的方法可以做到这一点?

简短的回答,是的。但变化将根据您的目标和使用情况而有所不同。您已经提到它是public void SomeMethod(object caller) { someClass<T> info = caller as someClass<T>; if (info != null) {} }

现在,您是否正在尝试执行以下操作:

Casting

这会向Abstract Class描述var detail = (SomeClassBase)viewBase.getAnyInstance(detailName);

Object

有很多变化。

与您的模糊问题类似的帖子here。另一篇文章可能会提供更多详情here。需要注意的是,如果您尝试传递已知的Generics,为什么不直接使用来电?

不幸的是,您的问题需要更多详细信息才能获得更好的答案。但听起来你很难理解{{1}}。