C# 调用适当重载的动态强制转换

C# 调用适当重载的动态强制转换,c#,generics,C#,Generics,我有一个公共泛型方法,它接受一个泛型参数。我还有几个私有方法,它们接受我从泛型方法调用的具体类型参数。为了更好地描述我的问题,请查看以下代码: public void Save<T>(T entity) where T : class { if(entity is LibraryItem) Save(entity as LibraryItem); else if(entity is Folder) Save(enti

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

    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);
    }

看看代码,我真的不喜欢这个解决方案,检查每一种可能的类型看起来都是一个糟糕的做法。所以我想知道有没有更干净的办法来解决我的问题?也许可以在运行时动态强制转换T并调用适当的私有方法?

使用运行时类型定义:

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){}

你在正确的轨道上。使用
dynamic
关键字获取运行时:


通常,重载解析是在编译时对静态类型(对于泛型类型是
object
)执行的。通过强制转换为
dynamic
,您将解析推迟到运行时,并且使用运行时类型而不是静态类型。

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


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

看起来downvoter不知道C#,但是有足够的声望来降低投票率:)并且从我这里把宇宙带到它的正常状态:)谢谢:-)已经提高了你的投票率,因为你记得需要一个超负荷接受
对象
。就这么简单吗?我期待着更复杂的事情,比如反思:)很高兴发现这一点。谢谢:)@Davita
dynamic
不是魔法。你应该意识到使用它的后果,因为它们很重要。
动态
肯定不是魔法,在静态类型语言中释放动态类型也不是没有问题的。重载解析是为数不多的安全使用方法之一。但是,对于性能关键的东西来说,它可能太贵了。
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){}
private void Save(object obj) {  }
Save((dynamic)entity);