3

我有一个接受一个泛型参数的公共泛型方法。我还有几个私有方法接受我从泛型方法调用的具体类型参数。为了更好地描述我的问题,请查看以下代码:

    public void Save<T>(T entity) where T : class
    {
        if(entity is LibraryItem)      Save(entity as LibraryItem);
        else if(entity is Folder)      Save(entity as Folder);
        else if(entity is ProductType) Save(entity as ProductType);
        else if(entity is ProcessName) Save(entity as ProcessName);
    }

和私有方法:

private void Save(ProcessName proc){}
private void Save(ProductType type){}
private void Save(Folder folder){}
...

查看代码,我真的不喜欢这个解决方案,检查每种可能的类型看起来像是一种不好的做法恕我直言。所以我想知道我的问题是否有更清洁的解决方案?也许可以在运行时动态转换 T 并调用适当的私有方法?

4

3 回答 3

7

使用运行时类型定义:

public void Save<T>(T entity) where T : class
{
    Save((dynamic)entity);
}

private void Save(LibraryItem lib){}
private void Save(ProcessName proc){}
private void Save(ProductType type){}
private void Save(Folder folder){}

您还需要一种带有对象类型参数的方法来处理实体不是 LibraryItem、ProcessName、ProductType 或 Folder 的情况:

private void Save(object obj) {  }
于 2013-01-08T18:42:35.023 回答
4

你在正确的轨道上。使用dynamic关键字来获得运行时重载解决方案

Save((dynamic)entity);

通常重载决议是在编译期间对静态类型(object用于泛型类型)进行的。通过强制转换为dynamic您将分辨率推迟到运行时,并且使用运行时类型而不是静态类型。

于 2013-01-08T18:42:55.187 回答
2

理想的机制是采用特定于该类型的任何方面Save并将其作为每个具体类型的一部分,以便您可以使用多态性。

每个项目负责保存自己可能不合适,但它应该做的是公开足够的信息以允许其他人编写一个通用Save方法,该方法简单地接受一个接口或基类型,您的所有类型都实现该接口或基类型为该类型公开足够的信息以允许保存它。

于 2013-01-08T18:50:09.370 回答