簡體   English   中英

與通用屬性的接口

[英]Interface with a Generic property

我有這樣的結構的簡化版本:

    public class ClassX { }
    public class ClassY { }

    public interface A<T>
    {

        T Data { get; set; }
    }

    public class B : A<ClassY>
    {
        public ClassY Data { get; set; }
    }

    public class C : A<ClassX>
    {
        public ClassX Data { get; set; }
    }   

然后我想做的是這樣的:

    public class Example
    {
        public A Retrieve(string type)  // Point A
        {
            if (type == "B")
            {
                return new B();         // Point B
            }
            else
            {
                return new C();         // Point B
            }
        }
    }

所以第一個問題是我不能使用上述方法的返回類型(A點),因為返回類型出現此錯誤: CS0305: Using the generic type 'A<T>' requires 1 type arguments

然后我將代碼更改為此,希望將泛型類型設置為dynamic可以解決我的問題:

    public class Example
    {
        public A<dynamic> Retrieve(string type)  // Point A
        {
            if (type == "B")
            {
                return new B();         // Point B
            }
            else
            {
                return new C();         // Point B
            }
        }
    }

但是,我得到了點 B 和點 C 的此錯誤: CS0266: Cannot implicitly convert type 'Ticketing.XF.B' to 'Ticketing.XF.A<dynamic>'. An explicit conversion exists (are you missing a cast?) CS0266: Cannot implicitly convert type 'Ticketing.XF.B' to 'Ticketing.XF.A<dynamic>'. An explicit conversion exists (are you missing a cast?)

我現在被困住了。 什么是我想做的干凈和適當的解決方案?

這只能通過類的接口來完成。 如果要使用工廠方法,則基本接口不能是通用的。 或者您需要返回一個基本類型,例如 object

public interface IClass
{
    
}
public class ClassX : IClass { }
public class ClassY : IClass { }

public interface A
{
    IClass Data { get; set; }
}

public class BC<T> : A  where T : class, IClass
{
    public IClass Data { get; set; }

    public T As()
    {
        return Data as T;
    }
}


public class Example
{
    public A Retrieve(string type)  // Point A
    {
        switch (type)
        {
            case "B":
                return new BC<ClassX>();
            default:
                return new BC<ClassY>();
        }
    
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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