【问题标题】:How to cast by generic type如何按泛型类型转换
【发布时间】:2013-02-07 21:42:47
【问题描述】:

我想使用泛型类型进行转换,有什么简单的方法可以做到这一点吗?这是一个例子:

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

其中 T 是现有类型之一。

任何建议将不胜感激。

【问题讨论】:

  • 这实际上没有意义。你想做什么?
  • 您是在用通用方法说您想这样做吗?并且需要注意T必须被限制为where T : class,因为as如果不是请求的类型则返回null,并且值类型不能是null
  • 我想使用参数化的 T 并由它强制转换(T 可能是我的自定义类之一)
  • 应该可以。你试过了吗?
  • 是的,我做到了。但是我还在学习 C#,所以我可能会犯一个基本的错误。我会继续努力的。。

标签: c# generics casting abstract-class


【解决方案1】:

Generic 是一种处理多种类型Objects 的奇特方式,而无需清楚简明地了解您的操作内容。这本身就产生了很大的灵活性,因为它可以缓解您在使用BoxingUnboxing 时可能遇到的一些问题。

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

问题是,如果您尝试在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));

我们实际上已经将GenericCast 这些值直接用于我们的新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

【讨论】:

  • 非常感谢您的回答和 cmets。我目前正在研究它并试图以更复杂的方式理解问题。再次感谢!
  • 没问题。希望我的回答有点帮助。它帮助我理解,但其他人可能不会。
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多