在C#

时间:2017-07-21 09:17:50

标签: c# generics

有没有一种方法告诉方法哪种类型的泛型?我想要做的是告诉方法它只能是A或B类型的对象,但没有别的,所以我可以像

一样工作

if (myObject.GetType() == typeof(myTypeA)){doAstuff();} if (myObjectGetType() == typeof(myTypeB)) {doBstuff();}

method<T>(T myObject){ T = myTypeA, T = myTypeB, T = nothing else}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以使用where命令限制gernic的允许类型:

public void Test<T>(T param) where T : TypeA {
  ...
}

https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/where-generic-type-constraint

但这只是简单的约束,所以它不能解决两个类的问题,但是对于这种情况你可以使用方法重载:

public void Test(TypeA param) {
  ...
}
public void Test(TypeB param) {
  ...
}

如果你只有两个班级,我认为这是最好的解决方案,因为仿制药没有任何好处。

答案 1 :(得分:1)

您可以检查方法中的类型,然后将其转换为适当的类型并执行相应的“填充”:

public void method<T>(T myObject)
{
    if (myObject is myTypeA)
    {
        myTypeA objA = myObject as myTypeA;
        objA.DoA_Stuff();
    }
    else if (myObject is myTypeB)
    {
        myTypeB objB = myObject as myTypeB;
        objB.DoB_Stuff();
    }
    else
    {
        return ;
    }
}

但这会浪费仿制药。如果他们共享一些方法,你也可以创建一个基类,让typeA和typeB继承它。然后您的方法可以将基类对象作为参数:

public void method(BaseClass myObject)

并且只有一个if-case和一个cast。只有具有更多方法的那个然后是基类。

修改

想象一下你会有这样的结构:

public class BaseType
{
    public int SharedProp { get; set; } // shared property 

    public virtual int DoSharedStuff() // shared method
    {
        return SharedProp;
    }    
}

public class myTypeA : BaseType
{
    public int A_Prop { get; set; }

    // overwritten shared meth adjusted to the needs of type A
    public override int DoSharedStuff() 
    {
        return base.SharedProp + this.A_Prop;
    }
}

public class myTypeB : BaseType
{
    public int B_Prop { get; set; }

    // overwritten shared meth adjusted to the needs of type B
    public override int DoSharedStuff()
    {
        return base.SharedProp + this.B_Prop;
    }

    // individual method of Type B
    public int DoB_Stuff()
    {
        return this.B_Prop;
    }
}

然后你的方法只会占用基类的一个子节点并根据需要执行:

public void method(BaseType myObject)
{
    // shared case: here type A will perform type A action 
    // and type B will perform type B action
    myObject.DoSharedStuff();

    // case B where you need really the extra stuff!
    if (myObject is myTypeB)
    {
        myTypeB objB = myObject as myTypeB;
        objB.DoB_Stuff();
    }
}

这种方法或现象称为Polymorphism