我有一个泛型函数和以下类层次结构:
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;
}
答案 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!
}
}
如果您将两种类型约束为两种特定的引用类型,则通用方法不会对您有任何帮助。您可以直接使用基类 - 它更简单,更容易调用,更易理解,并且整体效果更好。