【发布时间】:2018-01-04 19:40:36
【问题描述】:
假设我有一个静态类,它定义了一堆如下所示的委托:
namespace MyNamespace {
public static class Delegates<T> {
public delegate T Create(T input);
public delegate T Update(T input);
public delegate T Get(Guid id);
public delegate bool Delete(Guid id);
}
}
然后我有一个使用这些委托的泛型类,其中依赖类的泛型类型与静态类的泛型类型相同。
namespace MyNamespace {
public class MyClass<T> {
public void MyMethod(Delegates<T>.Create create) {
T foo = GenerateSomeT();
create(foo);
}
}
}
我很想在MyMethod 实现中去掉Delegates<T>. 前缀,因为我相信它可以提高代码的可读性。通常我已经从 C# 6 中通过 the "using static" directive 删除了静态类作为前缀。但在这种情况下,T 不是“完全限定类型名称”,所以我看不到实现这一点的方法.我很想做类似以下示例的操作,但这并不像人们期望的那样工作。原因是T 在MyClass 的范围之外仍未定义。
using static MyNamespace.Delegates<T>;
namespace MyNamespace {
public class MyClass<T> {
public void MyMethod(Create create) {
T foo = GenerateSomeT();
create(foo);
}
}
}
编译器也不允许我在类中移动“使用静态”指令。
是否可以使用using static 指令或其他一些技巧来避免每次消费者想要使用其属性或方法之一时显式声明具有非限定泛型类型的泛型静态类?
【问题讨论】:
-
您要做的最好的事情是使
Delegates<T>非静态并从它继承。但这在单继承语言中似乎是个坏主意。我不建议反思。就我个人而言,我会接受它并忍受额外的打字和混乱。 -
Delegates 类必须是通用的吗?
标签: c# generics static using using-directives