[英]C#: Is there a way to cast a class to an interface it implements at runtime, but not compile time?
如果我有一個基類和幾個實現接口的派生類,例如:
public class BaseClass
{
}
public interface IInterface
{
void SomeMethod();
}
public class DerivedA : BaseClass, IInterface
{
public void SomeMethod()
{
// some implementation
}
}
public class DerivedB: BaseClass, IInterface
{
public void SomeMethod()
{
// some other implementation
}
}
我有一個不相關的類,具有BaseClass字段:
public class UnrelatedClass
{
public BaseClass foo;
}
假設我的實現假定foo應該是某個實現了該接口的派生類(但我不知道是哪個類,所以我不能僅將其強制轉換為該類),我可以以某種方式將其強制轉換為IInterface並調用foo.SomeMethod()而不用產生編譯錯誤?
PS-我知道這是一種真正的回旋方式,應該改用“ IInterface foo”字段,但是由於Unity沒有序列化接口字段並且不想編寫自定義檢查器-這是我正在嘗試的解決方法。
您可以通過反射(慢!)訪問接口方法,也可以使用as
運算符“安全轉換”。 如果強制轉換失敗,則as
運算符“返回” null
。 像這樣:
var impl = foo as IInterface;
impl?.SomeMethod()
// or if(impl != null) impl.SomeMethod();
現在,您的BaseClass
在您的設計中毫無意義。 如果您要稍微更改設計,那么甚至可能不需要在運行時執行檢查。 這是一個建議的設計,其中BaseClass
實現IInterface
,派生類需要重寫它:
public interface IInterface
{
void SomeMethod();
}
public abstract class BaseClass : IInterface
{
public abstract void SomeMethod();
// Or virtual with common implementation
}
public class DerivedA : BaseClass
{
public override void SomeMethod()
{
// some implementation
}
}
public class DerivedB : BaseClass
{
public override void SomeMethod()
{
// some other implementation
}
}
我將通過更改您的設計來提供解決方案。 我想您的最終目標是希望您的foo
對象具有BaseClass
和 IInterface
所有成員。 您可以像這樣創建一個抽象類:
abstract class BaseClassAndInterface: BaseClass, IInterface {
public abstract void SomeMethod();
}
現在,使DerivedA
和DerivedB
從BaseClassAndInterface
繼承,並在接口中實現該方法。
public class DerivedA : BaseClassAndInterface
{
public override void SomeMethod()
{
// some implementation
}
}
public class DerivedB: BaseClassAndInterface
{
public override void SomeMethod()
{
// some other implementation
}
}
現在,可以將foo
聲明為BaseClassAndInterface
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.