簡體   English   中英

具有未指定類型的泛型類的屬性

[英]Property of an generic class with unspecified type

我有一個帶有兩個類型參數的通用類SomeClass

public class SomeClass<T, U>
    where T : IFoo
    where U : IBar
{
    public void SomeMethod(T t) { /* ... */ }
}

然后我有另一個帶有一個類型參數的泛型類SomeOtherClass 在這個類中,我想要一個SomeClass的屬性。 對於此屬性,我只希望SomeClass的第一個類型參數與SomeOtherClass的類型參數匹配,而我不關心第二個類型參數。 所以我想做的是

public class SomeOtherClass<T>
     where T : IFoo
{
     public SomeClass<T, U> Frob { get; set; }
}

但這顯然無法編譯。 可以做到嗎?

我認為唯一可行的方法是定義一個不執行任何操作的IBar實現並使用它。

public class NullBar: IBar
{
   // whatever no-op implementation that makes sense
}

public class SomeOtherClass<T>
     where T : IFoo
{
     public SomeClass<T, NullBar> Frob { get; set; }
}
public class SomeClass<T, U>
    where T : IFoo
    where U : IBar
{
    public void SomeMethod(T t) { /* ... */ }
}

我注意到的第一件事是,如果您不需要'U',我就不會約束U。這只會使實現變得混亂,並使事情變得更加困難。

第二點是我不認為您可以具有隱式隱含的泛型屬性,但是您絕對可以使用方法來做到這一點。

public class SomeOtherClass<T>
    where T : IFoo
{
    public SomeClass<T, U> Frob { get; set; }
}

變成(使用抽象類忽略實現細節)

public abstract class SomeOtherClass<T>
    where T : IFoo
{
    public abstract SomeClass<T, U> Frob<U>(U parameter);
}

除非有歧義,否則您無需指定“ U”通用參數。 無論您通過什么參數作為參數,都將隱含“ U”。

如果那不適合您的需求,那么我想到的另一件事是通過子類默認U泛型:

public class SomeOtherClass<T, U>
    where T : IFoo
    where U : IBar
{
    public SomeClass<T, U> Frob { get; set; }
}

public class SomeOtherClass<T> : SomeOtherClass<T, IBar>
    where T : IFoo
{
}

否則,一個接口就足夠了(這可能是我的建議是在此級別將其默認設置)...

public class SomeOtherClass<T>
    where T : IFoo
{
    public SomeClass<T, IBar> Frob { get; set; }
}

暫無
暫無

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

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