通用函数问题C#

时间:2009-03-15 17:13:23

标签: c# asp.net generics

我有一个泛型函数和以下类层次结构:

protected virtual void LoadFieldDataEditor <T1, T2> (T1 control, T2 objData, string strFieldName) where T1 : Control where T2 : BaseDataType
{
  //I will need to access field1. 
  //I don't know at compile time if this would be SomeType1 or 
 //SomeType2 but all of them inherit from BaseDataType. 

  //Is this possible using generics?
}

public abstract class BaseDataType {}

public class SomeType1 : BaseDataType
{
   string field1;
   string field2;
}

public class SomeType2 : BaseDataType
{
   string field3;
   string field4;
}

3 个答案:

答案 0 :(得分:3)

这只有在你有一些暴露field1的具体类型时才有可能。在这种情况下,您有BaseDataType,它可以给出在所有基类中实现的虚拟属性。

public abstract class BaseDataType {
  public abstract string Field1 { get; } 
}

这允许您访问LoadFieldDataEditor

中的属性
protected virtual void LoadFieldDataEditor <T1, T2> (T1 control, T2 objData, string strFieldName) where T1 : Control where T2 : BaseDataType
{
  string f1 = objData.Field;
}

在SomeType1中实现属性是直截了当的。只需实现该属性并返回基础字段。

public class SomeType1 : BaseDataType {
  public override string Field1 { get { return field1; } }
  // Rest of SomeType
}

问题是SomeType2应该为Field1返回什么?您的问题不清楚如何实施。

答案 1 :(得分:1)

没有。除非在BaseDataType上声明“field1”,否则在不转换为SomeType1的情况下将无法访问它。

答案 2 :(得分:1)

不,但这首先不是通用方法的合适用法。只需将您的方法重写为:

protected virtual void LoadFieldDataEditor(Control control, BaseDataType objData, string strFieldName)
{
    SomeType1 type1 = objData as SomeType1;
    if (type1 != null)
    {
         // use type1.field1 here!
    }

}

如果您将两种类型约束为两种特定的引用类型,则通用方法不会对您有任何帮助。您可以直接使用基类 - 它更简单,更容易调用,更易理解,并且整体效果更好。