1

这可能是一个简单的,但我的头拒绝围绕它,所以在这种情况下外部视图总是有用的!

我需要设计一个对象层次结构来为患者实现参数注册。这将在某个日期发生并收集有关患者的许多不同参数(血压、心率等)。这些参数注册的值可以是不同的类型,例如字符串、整数、浮点数甚至是 guid(用于查找列表)。

所以我们有:

public class ParameterRegistration
{
  public DateTime RegistrationDate { get; set; }
  public IList<ParameterRegistrationValue> ParameterRegistrationValues { get; set; }
}

public class ParameterRegistrationValue
{
  public Parameter Parameter { get; set; }
  public RegistrationValue RegistrationValue { get; set; }   // this needs to accomodate the different possible types of registrations!
}


 public class Parameter
  {
    // some general information about Parameters
  }

public class RegistrationValue<T>
{
  public RegistrationValue(T value)
  {
    Value = value;
  }

  public T Value { get; private set; }
}

更新:多亏了这些建议,该模型现在已演变为以下内容:

public class ParameterRegistration
{
  public DateTime RegistrationDate { get; set; }
  public IList<ParameterRegistrationValue> ParameterRegistrationValues { get; set; }
}

public abstract class ParameterRegistrationValue() 
{
  public static ParameterRegistrationValue CreateParameterRegistrationValue(ParameterType type)
{
    switch(type)
    {
        case ParameterType.Integer:
            return new ParameterRegistrationValue<Int32>();
        case ParameterType.String:
                return new ParameterRegistrationValue<String>();
        case ParameterType.Guid:
            return new ParameterRegistrationValue<Guid>();
        default: throw new ArgumentOutOfRangeException("Invalid ParameterType: " + type);
    }
}
  public Parameter Parameter { get; set; }
}

public class ParameterRegistrationValue<T> : ParameterRegistrationValue
{
  public T RegistrationValue {get; set; }
}

public enum ParameterType
{
  Integer,
  Guid,
  String
}

public class Parameter
{
  public string ParameterName { get; set; }
  public ParameterType ParameterType { get; set;}
}

这确实有点简单,但现在我想知道,由于 ParameterRegistration 中的 IList 指向抽象的ParameterRegistrationValue 对象,我将如何获取实际值(因为它存储在子对象上)?

也许整个通用的东西确实不是完全可以走的路:s

4

4 回答 4

4

如果您不知道最终的参数集和每个参数的相应类型,那么泛型可能无济于事 - 使用object作为参数值类型。

此外,遍历参数列表会很痛苦,因为您必须检查每个项目的类型才能确定如何处理该值。

你想用泛型实现什么?是的,它们很酷(并且进行装箱/拆箱可能不是一个最佳主意),但在某些情况下,您可能想要使用object代替(为了简单和灵活)。

——帕维尔

于 2011-01-04T10:07:26.490 回答
2

您可能想要介绍的是一个RegistrationValue<T>非泛型的抽象基类,因此您的ParameterRegistrationValue类可以保存非泛型引用,而无需了解所涉及的类型。或者,也可以将其设为ParameterRegistrationValue泛型,然后为其添加一个非泛型基类(这样其中的值列表ParameterRegistration可以是不同的类型。

第一种方式:

public abstract class RegistrationValue
{
}

public class RegistrationValue<T> : RegistrationValue
{
  public RegistrationValue(T value)
  {
    Value = value;
  }

  public T Value { get; private set; }
}

现在你的代码应该可以编译了。


一旦你有了一个非泛型基类,我也会将不依赖泛型类型参数的泛型类的任何成员移到这个基类中。此示例中没有任何内容,但如果我们改为修改ParameterRegistrationValue为泛型,我将Parameter向上移动到非泛型基类(因为它不依赖于 的类型参数RegistrationValue

于 2011-01-04T09:58:32.913 回答
0

我相信您希望拥有不同RegistrationValues 派生类的实例集合,并能够对其进行迭代,并为每个元素设置不同的类型。那是相当不可能的。

您仍然需要将每个元素转换为您知道的类型,因为迭代集合将返回对您的基本类型的引用(ParameterRegistrationValue- 这个由IList类型参数指定)。因此,它与迭代非泛型object列表没有任何真正的区别。

如果您可以安全地为每个参数进行转换(您知道所有类型),您可能根本不需要像这样的集合 - 最好有一个将所有参数封装在一种类型中的类,所以您可以使用强类型、IntelliSense 等来调用它,如下所示:

public class ParameterRegistration
{
  public DateTime RegistrationDate { get; set; }
  public PatientData PatientData { get; set; }
  public Guid Identifier { get; set; }
  // ...
}
于 2011-01-04T10:14:26.120 回答
0

可能是,您应该使用 public RegistrationValue RegistrationValue,其中 T - 是类型,使用泛型。例如,T - 是 String 或其他类或结构。

或者您应该将类​​ ParameterRegistrationValue 设为泛型,以便在字段 RegistrationValue 中使用泛型参数。

于 2011-01-04T09:48:04.793 回答