接受类型的泛型方法,修改其基类属性,返回类型

时间:2018-02-02 08:04:25

标签: c# generics

我有一个要求:

我有一个基类和一组派生类:

public class BaseClass
{
    public bool IsGood {get; set;}
}

public class DerivedClassA : BaseClass
{
    public bool CanTalk {get; set;}
}

public class DerivedClassB : BaseClass
{
    public bool CanGrowl {get; set;}
}

对于每个派生类(DerivedClassADerivedClassB),我有重复的代码

  1. 我有一个方法来获取派生类(DerivedClassADerivedClassB),
  2. 修改基类(IsGood
  3. 的公共属性
  4. 返回派生类
  5. 似乎我可以通过使用泛型来删除重复。

    我的伪代码看起来如下:

    //not sure what the signature should look like
    public T MakeGood<T>(T thing) 
    {
        //gets either DerivedClassA or DerivedClassB
        //sets base property IsGood to True
        //return either DerivedClassA or DerivedClassB
    }
    

    我可以使用泛型做什么吗?

    这可以在不修改类结构的情况下实现吗?

    如果解决方案已经存在,请提前道歉。

3 个答案:

答案 0 :(得分:4)

是的,在T上设置类型约束。

public T MakeGood<T>(T thing) where T : BaseClass
{
    thing.IsGood = true;

    return thing;
}

但我确实怀疑这种方法在当前形式下是否非常有用。该方法实际上应该是静态的,因为您似乎不使用实例属性。为什么要回归T

答案 1 :(得分:3)

使用类型约束:

public T MakeGood<T>(T thing) where T : BaseClass {
  …
}

只能针对从T中获取T的{​​{1}}类型进行实例化。请参阅 Constraints on Type Parameters

答案 2 :(得分:-1)

您确定要将此作为方法吗?这似乎是你所说的代码气味......我需要更多地了解这个过程。

考虑使用virtual属性并在子类中覆盖它。

public class BaseClass
{
   public virtual bool IsGood {get;}
}

public class DerivedClassA : BaseClass
{
   public override bool IsGood {get { return CanTalk; }}
   public bool CanTalk {get; set;}
}

public class DerivedClassB : BaseClass
{
   public override bool IsGood {get { return CanGrowl; }}
   public bool CanGrowl {get; set;}
}