[英]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.