如何让编译器从用户创建的类中推断出类型?

时间:2012-11-26 01:31:00

标签: c# generics

说我有这样的课程:

static class TestClass<T>
{
    public static void TestMethod(T t)
    {

    }
}

有没有办法推断参数,所以我可以替换它:

TestClass<int>.TestMethod(5);

有了这个吗?

TestClass.TestMethod(5);

2 个答案:

答案 0 :(得分:3)

不是这个类是通用的。但是只使静态方法有效:

static class TestClass
{
    public static void TestMethod<T>(T t)
    {

    }
}

调用:

TestClass.TestMethod(5);    // TestClass.TestMethod<int>(int t)

答案 1 :(得分:0)

如果你仍然需要通用的静态类(不仅仅是通用的静态方法),你可以为它写一个类似“工厂”类的smth(我称之为MyInvoker):

static class MyClass<T>
{
    static T myT;

    public static void DoWork<T>(T t)
    {
    }
}

static class MyInvoker
{
    public static void DoWork<T>(T t)
    {
        MyClass<T>.DoWork(t);
    }
}

稍后在您的代码中,您可以使用MyInvoker省略类名中的泛型,例如:

MyInvoker.DoWork(4);

这会让你重复这个调用者中原始类的所有方法,所以我认为这不是一个很好的解决方案。 DRY原则被明确违反。当然,人们可以尝试通过反思来做到这一点,但这是另一个具有众所周知的缺点的故事。


如果你的课程是非静态的,你可以使用这样的工厂方法:

static class TestClass
{
    public static TestClass<T> GetInstance<T>(T _t)
    {
        return new TestClass<T>(_t);
    }
}

class TestClass<T>
{
    T t;

    public TestClass(T _t)
    {
        this.t = _t;
    }

    public T Value
    {
        get
        {
            return t;
        }
    }

    //...        
}

var tc = TestClass.GetInstance(5);
int val = tc.Value; //int TestClass<int>.Value