C# 避免对不合格泛型类型的泛型静态类使用类名

C# 避免对不合格泛型类型的泛型静态类使用类名,c#,generics,static,using,using-directives,C#,Generics,Static,Using,Using Directives,假设我有一个静态类,它定义了一组委托,如下所示: 名称空间MyNamespace{ 公共静态类委托{ 公共委托T创建(T输入); 公共代表T更新(T输入); 公共委托无法获取(Guid id); 公共委托bool Delete(Guid id); } } 然后我有一个使用这些委托的泛型类,其中依赖类的泛型类型与静态类的泛型类型相同 名称空间MyNamespace{ 公共类MyClass{ 公共void MyMethod(Delegates.Create){ T foo=GenerateSome

假设我有一个静态类,它定义了一组委托,如下所示:

名称空间MyNamespace{
公共静态类委托{
公共委托T创建(T输入);
公共代表T更新(T输入);
公共委托无法获取(Guid id);
公共委托bool Delete(Guid id);
}
}
然后我有一个使用这些委托的泛型类,其中依赖类的泛型类型与静态类的泛型类型相同

名称空间MyNamespace{
公共类MyClass{
公共void MyMethod(Delegates.Create){
T foo=GenerateSomeT();
创建(foo);
}
}
}
我希望在
MyMethod
实现中去掉
委托。
前缀,因为我相信它提高了代码的可读性。通常我已经将静态类作为前缀via从C#6中删除。但是在这种情况下,
T
不是一个“完全限定的类型名”,所以我看不到实现这一点的方法。我很想做下面的例子,但这并不像人们期望的那样有效。原因是
T
MyClass
的范围之外仍然没有定义

使用静态MyNamespace.Delegates;
名称空间MyNamespace{
公共类MyClass{
公共void MyMethod(创建){
T foo=GenerateSomeT();
创建(foo);
}
}
}

编译器也不允许我在类内部移动“using static”指令


是否可以使用
using static
指令或其他一些技巧,以避免每次使用者想要使用其属性或方法之一时,使用非限定泛型类型显式声明泛型静态类?

简单回答是否,我们不能这样做

不能使用类型尚未解析为具体类型或接口类型的泛型类型参数编写using语句

发件人:

泛型类,如泛型简介中列出的泛型列表,不能按原样使用,因为它不是真正的类型;它更像是一个类型的蓝图。要使用GenericList,客户端代码必须通过在尖括号内指定类型参数来声明和实例化构造的类型。此特定类的类型参数可以是编译器识别的任何类型

所有
T
参数都需要通过调用使用该泛型类型的代码来解决,如果使用语句,我们无法指定替换泛型
T
参数的方式

您可以使用静态MyNamespace.Delegates执行类似的操作:
,但不能执行您正在尝试执行的操作。我认为,你们需要坚持你们在第一种方法中尝试过的方法

编辑:
在快速搜索之后,我找到了一个。

简短的回答是“不”,我们不能这样做

不能使用类型尚未解析为具体类型或接口类型的泛型类型参数编写using语句

发件人:

泛型类,如泛型简介中列出的泛型列表,不能按原样使用,因为它不是真正的类型;它更像是一个类型的蓝图。要使用GenericList,客户端代码必须通过在尖括号内指定类型参数来声明和实例化构造的类型。此特定类的类型参数可以是编译器识别的任何类型

所有
T
参数都需要通过调用使用该泛型类型的代码来解决,如果使用语句,我们无法指定替换泛型
T
参数的方式

您可以使用静态MyNamespace.Delegates执行类似的操作:
,但不能执行您正在尝试执行的操作。我认为,你们需要坚持你们在第一种方法中尝试过的方法

编辑:
在快速搜索之后,我发现了一个。

您不能简单地将
代理
设置为非泛型,并将代理本身设置为泛型吗

public static class Delegates
{
     public delegate T Create<T> Create(T input);
     //etc
}
但一旦你到了这一点,你必须意识到这是毫无意义的。委托本身就是类型,它们不需要包含在类中,因此您可以简单地执行以下操作:

public delegate T Create<T>(T t);

public class MyClass<T>
{

    public void MyMethod(Create<T> create)
    {
         //...
    }
}
公共委托T创建(T);
公共类MyClass
{
公共void MyMethod(创建)
{
//...
}
}

无需使用静态指令。这就是所有内置框架委托的定义方式:
Func
Action
,等等。

您不能简单地将
委托
设为非泛型,并将委托本身设为泛型吗

public static class Delegates
{
     public delegate T Create<T> Create(T input);
     //etc
}
但一旦你到了这一点,你必须意识到这是毫无意义的。委托本身就是类型,它们不需要包含在类中,因此您可以简单地执行以下操作:

public delegate T Create<T>(T t);

public class MyClass<T>
{

    public void MyMethod(Create<T> create)
    {
         //...
    }
}
公共委托T创建(T);
公共类MyClass
{
公共void MyMethod(创建)
{
//...
}
}

无需使用静态指令。这就是所有内置框架委托的定义方式:
Func
Action
,等等。

最好的方法是使
委托成为非静态的,并从中继承。但在单一继承语言中,这似乎是个坏主意。我不建议反思。就我个人而言,我会接受它,忍受额外的输入和混乱。Delegates类必须是泛型的吗?最好是使
Delegates
非静态并从中继承。但在单一继承语言中,这似乎是个坏主意。我不建议反思。就我个人而言,我会接受它,忍受额外的输入和混乱。委托类必须是泛型的吗?+1。这是一个有效的选择,但它有自己的权衡。现在如果一个