JBe*_*rer 5 c# generics interface
基本上我有一个对象列表,其中每个对象可能实现一组不同的接口:
List<BaseObject> objects;
class BaseObject
{
public void DoStuff();
}
interface IX
{
void DoX();
}
interface IY
{
void DoY();
}
interface IZ
{
void DoZ();
}
Run Code Online (Sandbox Code Playgroud)
我想写这样的东西:
foreach(var obj in objects.OfType<BaseObject and IX>)
{
obj.DoStuff();
obj.DoX();
}
Run Code Online (Sandbox Code Playgroud)
(例如,我为BaseObject和IX类型的对象执行特定的算法,而不必在那里进行类型转换)
可以用C#做吗?什么是最优雅的解决方案?
我可以做这个:
foreach(var obj in objects.OfType<IX>)
{
var baseobj = (BaseObject)obj.DoStuff();
obj.DoX();
}
Run Code Online (Sandbox Code Playgroud)
但我发现它很难看.
我可能需要将特定操作应用于实现说接口IX和接口IZ的类型.
foreach(var obj in objects.OfType<BaseType and IX and IZ>)
{
obj.DoStuff();
obj.DoX();
obj.DoZ();
}
Run Code Online (Sandbox Code Playgroud)
一种可能的方法是使用dynamic:
foreach(var xz in objects.Where(o => o is IX && o is IZ).Select(o => (dynamic)o))
{
xz.DoStuff();
xz.DoX();
xz.DoZ();
}
Run Code Online (Sandbox Code Playgroud)
当然,如果你不想使用,你仍然可以强制转换dynamic:
foreach(var xz in objects.Where(o => o is IX && o is IZ))
{
xz.DoStuff();
((IX)xz).DoX();
((IZ)xz).DoZ();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1396 次 |
| 最近记录: |