我正在做一个小例子来检查参数的类型是否有效。

class A
{
}

class B
{
}

class C
{
}

class D
{
    public void SomeMethod<T>(T t) where T : class
    {
        if (t is A)
        {
            A a = t as A;
        }
        else if (t is B)
        {
            B b = t as B;
        }
    }
}

然后,我可以调用:
A a = new A();
SomeMethod<A>(a);

B b = new B();
SomeMethod<B>(b);

现在,我想阻止将 C 类传递给 SomeMethod 。我想要达到的目标:
C c = new C();
SomeMethod<C>(c); // error

为此,我尝试过:
public void SomeMethod<T>(T t) where T : A
{
    // accept only class A
}

或者
public void SomeMethod<T>(T t) where T : B
{
    // accept only class B
}

我的问题是:如何用SomeMethod声明T可以同时是AB?就像:
public void SomeMethod<T>(T t) where T : A, B
{
    // accept class A and class B
}

最佳答案

正如 Lee 所说,这违背了泛型的目的。为了实现您所描述的内容,只需为每种情况编写重载

class A { }
class B { }
class C { }

class D
{
    public void SomeMethod(A a)
    {
        //Do stuff with a
    }
    public void SomeMethod(B b)
    {
        //Do stuff with b
    }
}

如果你想有一个运行时错误,你可以做这样的事情:
class A { }
class B { }
class C { }

class D
{
    public void SomeMethod<T>(T t) where T : class
    {
        if (t is A)
        {
            A a = t as A;
        }
        else if (t is B)
        {
            B b = t as B;
        }
        else //if (t is C)
        {
            throw new ArgumentException();
        }
    }
}

虽然这是一个糟糕的解决方案。重载解决方案仍然更清晰,并且会产生编译时错误。

关于c# - 具有动态 T 的通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36650534/

10-12 12:42