C# - 如何将对象转换为子类的泛型类型?

时间:2014-12-22 15:35:49

标签: c# generics casting

我手边有以下代码:

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一样。在我的例子中,它是一个自定义类。这里提供的解决方案不适用于我的问题。

2 个答案:

答案 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>;