好的,情况就是这样:
我有一个通用的基类,我需要用一些静态值来初始化它。这些值与我的泛型基类加载的类型无关。
我希望能够做这样的事情:
GenericBaseclass.Initialize(AssociatedObject);
同时还有这样的课程:
public class DerivedClass : GenericBaseclass<int>
{
...
}
有没有办法做到这一点?我可以创建一个非泛型基类并将静态方法放在那里,但我不喜欢那个“hack”:)
好的,情况就是这样:
我有一个通用的基类,我需要用一些静态值来初始化它。这些值与我的泛型基类加载的类型无关。
我希望能够做这样的事情:
GenericBaseclass.Initialize(AssociatedObject);
同时还有这样的课程:
public class DerivedClass : GenericBaseclass<int>
{
...
}
有没有办法做到这一点?我可以创建一个非泛型基类并将静态方法放在那里,但我不喜欢那个“hack”:)
如果这些值与泛型基类的类型无关,那么它们不应该在泛型基类中。它们应该在一个完全独立的类中,或者在泛型类的非泛型基类中。
请记住,对于静态变量,每个类型参数组合都会获得不同的静态变量:
using System;
public class GenericType<TFirst, TSecond>
{
// Never use a public mutable field normally, of course.
public static string Foo;
}
public class Test
{
static void Main()
{
// Assign to different combination
GenericType<string,int>.Foo = "string,int";
GenericType<int,Guid>.Foo = "int,Guid";
GenericType<int,int>.Foo = "int,int";
GenericType<string,string>.Foo = "string,string";
// Verify that they really are different variables
Console.WriteLine(GenericType<string,int>.Foo);
Console.WriteLine(GenericType<int,Guid>.Foo);
Console.WriteLine(GenericType<int,int>.Foo);
Console.WriteLine(GenericType<string,string>.Foo);
}
}
听起来您并不真正想要每个T
通用基类有一个不同的静态变量 - 所以您不能在通用基类中使用它。
这正是你必须做的。当您有一个类型参数时,该类型的每个不同实例化都是一个单独的类型。这导致单独的静态变量。
唯一的解决方法是拥有一个泛型类派生自的基类。