Generic 是一种处理多种类型Objects 的奇特方式,而无需清楚简明地了解您的操作内容。这本身就产生了很大的灵活性,因为它可以缓解您在使用Boxing 和Unboxing 时可能遇到的一些问题。
为了帮助您澄清Generics,我将使用List 示例。主要是因为至少对我来说,它确实巩固了Casting 和Generics。
问题是,如果您尝试在List Generics 之间切换Cast,您很快就会发现...您做不到。
在我的示例中,我将使用 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);
有很多变化。
与您的模糊问题here 相似的帖子。另一个可能提供更多细节的帖子here。需要注意的是,如果您尝试传递已知的Object,为什么不直接使用调用者?
很遗憾,您的问题需要更多详细信息才能获得更好的答案。但听起来你很难理解Generics。