簡體   English   中英

C#:有沒有一種方法可以將類強制轉換為在運行時實現的接口,而不是在編譯時實現的接口?

[英]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();
}

現在,使DerivedADerivedBBaseClassAndInterface繼承,並在接口中實現該方法。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM