Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一般函数问题C#_C#_Asp.net_Generics - Fatal编程技术网

一般函数问题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!
}

}

如果将这两种类型约束为两种特定引用类型,则泛型方法对您没有任何帮助。您可以直接使用基类——它更简单、更容易调用、更容易理解,并且总体上工作得更好