c# - 动态 T 的通用方法

标签 c# generics

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

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
}

我的问题是:如何声明SomeMethodT可以同时是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/

相关文章:

c# - 如何使 IEnumerable<T> 只读?

c# - 泛型 C# - 从静态泛型类创建实例

java - 使用泛型在列表中转换对象

c# - 如何从基类中获取子类的 `Type`

c# - Azure 资源管理器 - backupLongTermRetentionPolicies - 错误 "WeekOfYear is required to be set between 1 and 52 in order to set yearly retention."

c# - 在 mschart 中的列顶部显示 X 值

java - 点运算符 `.`(在通用参数之前)是什么意思?

java - 将类类型存储在 bean 中

c# - 在 XAML 中的 View 中绑定(bind)多个 ViewModel

c# - 将带有 CheckedChanged 事件的复选框添加到动态 GridView