【发布时间】:2019-01-11 23:31:04
【问题描述】:
我听说在 c# 中向上转换是在编译时完成的,所以使用起来非常便宜。 但是我有这种情况,我希望转换的类型是抽象的,它不直接实现我希望转换的接口。
这是一个示例:
public interface ISomething
{
void Method();
}
public abstract class Base { }
public class Derived : Base, ISomething
{
public void Method() { }
}
public class OtherDerived : Base, ISomething
{
public void Method() { }
}
public class SomeClass
{
private Base[] _baseArray;
public void SomeMethod()
{
foreach (var item in _baseArray)
((ISomething) item).Method();
}
}
显然,我处于_baseArray 的每个项目实际上都是从Base 继承并实现ISomething 的类型的情况。
但是由于我无法确定每个项目在Derived、OtherDerived 或从Base 继承并实现ISomething 的任何其他类型之间是什么类型,因此我必须使用抽象基类型的数组。
当然我可以使用ISomething 的数组,但是我使用 Unity 并且接口在编辑模式下不会被序列化,我需要序列化该数组。
所以,既然上下文在这里,我的问题如下:
将item 转换为ISomething 是否在编译时处理?如果不是,它是否足够便宜,可以经常进行(准确地说是在每一帧)?
感谢您的关注,如果我不是很清楚,对不起,我不是英语,所以这并不容易。
编辑:感谢更好的标题
【问题讨论】:
-
是否让
Base实现ISomething允许序列化而不需要强制转换? -
是的,但在我的情况下,从
Base继承的类型并不总是实现ISomething。Base派生类型可以实现许多其他接口(以及许多其他SomeMethod模式与这些其他接口)。
标签: c# performance interface casting abstract