嗨我有这样的方法:
public T LoadR<T, K>()
where T : ObservableCollection<K>, new()
where K : IStoreElement, new() {
T onC = new T();
//....
return (onC);
}
Run Code Online (Sandbox Code Playgroud)
此外,我有一个XObservableCollection类,它派生自ObservableCollection.当我打电话时,它的工作原理是:
Categories = LoadR<ObservableCollection<Category>,Category>();
Products = LoadR<XObservableCollection<Product>,Product>();
Run Code Online (Sandbox Code Playgroud)
我想要做的就是这样做一个调用(避免将K作为额外参数传递):
Categories = LoadR<ObservableCollection<Category>>();
Products = LoadR<XObservableCollection<Product>>();
Run Code Online (Sandbox Code Playgroud)
我知道我可以为它写一个扩展名.但我很好奇是否有办法在没有它的情况下实现这一目标.
曼弗雷德
我认为你不能。
C# 具有一种机制,可以在使用方法参数时理解来自方法参数的泛型参数,但不能理解同一方法的其他泛型参数。这不起作用。
也许您可以将签名更改为:
private static ObservableCollection<K> LoadR<K>(.ObservableCollection<K> onC)
where K : IStoreElement, new()
{
//....
return onC;
}
Run Code Online (Sandbox Code Playgroud)
用法是:
static void TestLoad()
{
var result1 = LoadR(new ObservableCollection<Something>());
var result2 = LoadR(new DerivedClassFromObservableCollection<Something>());
}
Run Code Online (Sandbox Code Playgroud)
我同意这不是那么好,而且我可以看出这不是您想要的。
但只是因为 C#不允许您尝试从泛型参数推断类型。
……
另一种方法是让它使用特定的集合。我看得出你更不想这样了。
因此,您可以做的一件事就是让它返回 IEnumerable,然后您的用法将类似于:
static void TestLoad()
{
var result1 = new ObservableCollection( LoadR<Something>() );
var result1 = new DerivedClassFromObservableCollection( LoadR<Something>() );
}
Run Code Online (Sandbox Code Playgroud)
如果您想对收藏本身做一些花哨的事情,这也可能不好,因为您不再拥有它。
....
我自己会选择第一个选择。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |