假设我有一些相对复杂的通用对象,可以简化为
class A<T>
{
static void foo(T x) { }
}
要使用foo,必须重复使用带有通用名称的类名。
A<MyLongTypeNameIsNotFunToType>.foo(x);
如果能够简化这一点,那将是非常好的:
alias AA = A<MyLongTypeNameIsNotFunToType>;
AA.foo(x);
我唯一能想到的就是创建一个包装类
class B : A<MyLongTypeNameIsNotFunToType> { }
允许我通过B访问A的静态成员。一个问题是,这需要一个公共构造函数,在我的情况下,这是不可能的。显然我可以将A的静态成员包装在B中,但这似乎非常多余。
[我尝试过使用,但请注意我需要访问静态成员,所以我需要静态类型。使用似乎不适用于静态类型。 错误:___是在给定上下文中无效的类型]
任何优雅的解决方案?
答案 0 :(得分:0)
要创建Type的别名,请在指定名称空间的位置执行以下操作
using S = MyLongTypeNameIsNotFunToType;
然后使用它,您可以执行以下操作
//A<S>.foo(new S());
A<S>.foo(x);
您还可以继续将A更改为以下
using S = MyLongTypeNameIsNotFunToType;
using AA = A<MyLongTypeNameIsNotFunToType>;
然后在你的代码中你可以去做
AA.foo(x);
或者
A<S>.foo(x);
这是复制并粘贴到控制台应用程序示例
中namespace ConsoleApplication3
{
using B = MyLongTypeNotFunToType;
using C = A<MyLongTypeNotFunToType>;
public class A<T>
{
public static void foo(T foo)
{
}
}
public class MyLongTypeNotFunToType
{
}
class Program
{
static void Main(string[] args)
{
var x = new B();
A<B>.foo(x);
C.foo(x);
}
}
}
答案 1 :(得分:0)
我有两个解决方案:
using
,正如其他人提到的那样.. 班级定义:
class A<T>
{
public static void foo(T x) { }
}
用法:
using Alias = A<MyLongTypeNameIsNotFunToType>;
public class Dummy
{
public Dummy(MyLongTypeNameIsNotFunToType x)
{
Alias.foo(x);
}
}
A
,以便隐式解析类型T
,这意味着参数x
的类型将自动解析类型T
(在编译时)。 我使用此选项的原因是您拥有static
方法,否则您可以使用与A<T>
相同的方式实现类List<T>
并使用上面给出的解决方案1。
班级定义:
class A // <-- removed the <T> from class and added in the method declaration
{
public static void foo<T>(T x) { }
}
用法:
public class Dummy
{
public Dummy(MyLongTypeNameIsNotFunToType x)
{
A.foo(x);
}
}
我希望你能看到解决方案2的简单性。
答案 2 :(得分:-1)