【问题标题】:Static methods on generic classes?泛型类的静态方法?
【发布时间】:2010-10-16 17:04:53
【问题描述】:

好的,就是这样:

我有一个通用基类,我需要用一些静态值对其进行初始化。这些值与我的泛型基类加载的类型无关。

我希望能够做这样的事情:

GenericBaseclass.Initialize(AssociatedObject);

同时也有这样的课程:

public class DerivedClass : GenericBaseclass<int>
{
   ...
}

有没有办法做到这一点?我可以创建一个非泛型基类并将静态方法放在那里,但我不喜欢那种“hack”:)

【问题讨论】:

  • 除了已经指出的非泛型基类是唯一的方法之外,我只想补充一点,这样做不是“黑客”,但实际上是正确的方法。

标签: c# generics static-methods


【解决方案1】:

如果这些值与泛型基类的类型无关,那么它们不应该在泛型基类中。它们应该在一个完全独立的类中,或者在泛型类的非泛型基类中。

请记住,对于静态变量,每个类型参数组合都会获得不同的静态变量:

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 有一个不同的静态变量 - 所以你不能在你的泛型中拥有它基类。

【讨论】:

  • “应该”作为“最佳实践”或“应该”作为“实现所需行为的唯一方法”? :)
  • 如果您只需要一个静态变量,尽管提供了不同的类型参数,这是“实现所需行为的唯一方法”。
  • 感谢您的澄清。我应该自己做,对此感到抱歉。不过,这很有意义:) - 现在,去睡觉吧,万事通先生:P
【解决方案2】:

这正是你必须做的。当您有一个类型参数时,该类型的每个不同实例化都是一个 separate 类型。这会导致单独的静态变量。

唯一的解决方法是拥有一个泛型类派生自的基类。

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多