我手边有以下代码:
class Document {}
class Track : Document {}
class Album : Document {}
class CellWrapper<T> {}
class TableViewSource {
protected void CreateCellForItem(object item) {
// item is an instance of CellWrapper<T> where T is a document extending Document
}
}
是否可以将item
投射到CellWrapper<Document>
?
我知道,你可以为我需要类似东西的方法定义一些东西,但我无法找到适合这种情况的东西。我只能确认(不是强制转换)它是CellWrapper的一个实例...
这样的事情无法编译:
CellWrapper<Document> wrapper = item as CellWrapper<T> where T : Document;
修改
只是为了澄清:这个问题与Casting generic typed object to subtype不同,因为如果item
是一个可以枚举的对象,那个名字只有一个解决方案,就像IList
一样。在我的例子中,它是一个自定义类。这里提供的解决方案不适用于我的问题。
答案 0 :(得分:2)
如果需要访问T类型的属性,可以使用反射访问该属性。但是,这不会将值转换为CellWrapper<Document>
:
class Document {
public string Key { get; set; }
}
class Track : Document {}
class Album : Document { }
class CellWrapper<T> where T : Document {
public T Document { get; set; }
}
class TableViewSource
{
public void CreateCellForItem(object item)
{
var documentProperty = item.GetType().GetProperty("Document");
var document = (Document)documentProperty.GetValue(item);
Console.WriteLine(document.Key);
}
}
答案 1 :(得分:-1)
就是这样:
CellWrapper<Document> wrapper = item as CellWrapper<Document>;