我想使用通用类型进行投射,有没有简单的方法可以做到这一点?这是一个例子:
var resource = viewBase.getAnyInstance(resourceName) as T;
其中T是现有类型之一。
任何建议都将不胜感激。
答案 0 :(得分:1)
Generic
是处理多种类型Objects
的一种奇特方式,没有任何明确的操作知识。这本身就会产生相当大的灵活性,因为它可以缓解您在使用Boxing
和Unboxing
时可能遇到的几个问题。
为了帮助您澄清Generics
,我将使用List
示例。主要是因为至少对我来说,Casting
与Generics
确实固化了。
问题是,如果您在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}}。