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