一般函数问题C#
我有一个泛型函数和以下类层次结构:一般函数问题C#,c#,asp.net,generics,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 b
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;
}
受保护的虚拟void LoadFieldDataEditor(T1控件、T2 objData、字符串strFieldName),其中T1:控件,其中T2:BaseDataType
{
//我需要进入field1。
//我不知道在编译时这是不是某种类型1或
//SomeType2但它们都继承自BaseDataType。
//这可以使用泛型吗?
}
公共抽象类BaseDataType{}
公共类SomeType1:BaseDataType
{
字符串字段1;
字符串字段2;
}
公共类SomeType2:BaseDataType
{
字符串字段3;
字符串字段4;
}
否。除非在BaseDataType上声明了“field1”,否则在不强制转换到SomeType1的情况下无法访问它。否。除非在BaseDataType上声明了“field1”,否则在不强制转换到SomeType1的情况下无法访问它。只有当您有一些暴露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;
}
但问题是SomeType2应该为Field1返回什么?你的问题不清楚该如何实施 只有当您有一些暴露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;
}
但问题是SomeType2应该为Field1返回什么?你的问题不清楚该如何实施 没有,但这在一开始就不是泛型方法的恰当使用。只需将您的方法重写为:
受保护的虚拟void LoadFieldDataEditor(控件、BaseDataType objData、字符串strFieldName)
{
SomeType1 type1=对象数据为SomeType1;
如果(类型1!=null)
{
//在这里使用type1.field1!
}
}
如果将这两种类型约束为两种特定引用类型,则泛型方法对您没有任何帮助。您可以直接使用基类-它更简单、更容易调用、更容易理解,并且总体上工作得更好。不,但这并不是泛型方法的正确使用。只需将您的方法重写为:
受保护的虚拟void LoadFieldDataEditor(控件、BaseDataType objData、字符串strFieldName)
{
SomeType1 type1=对象数据为SomeType1;
如果(类型1!=null)
{
//在这里使用type1.field1!
}
}
如果将这两种类型约束为两种特定引用类型,则泛型方法对您没有任何帮助。您可以直接使用基类——它更简单、更容易调用、更容易理解,并且总体上工作得更好