3

次のようなクラスがあるとします。

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

    }
}

引数を推測する方法はありますか?これを置き換えることができます:

TestClass<int>.TestMethod(5);

これとともに?

TestClass.TestMethod(5);
4

2 に答える 2

3

クラスがジェネリックであるわけではありません。ただし、メソッドを静的にするだけで機能します。

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

    }
}

呼び出し:

TestClass.TestMethod(5);    // TestClass.TestMethod<int>(int t)
于 2012-11-26T01:36:24.330 に答える
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
于 2012-11-26T01:54:23.910 に答える