如何使这种C#方法通用?

如何使这种C#方法通用?,c#,.net,generics,C#,.net,Generics,如何使下面的代码成为泛型代码,以便最终使用一个简单的函数代替多个类中的多个函数 下面对FindObject和CreateObject的调用是第三方库的一部分,因此我无法控制这些库的参数,正是在这里我陷入了困境 private MyClass1 FindClass1Object( string code ) { MyClass1 myObject = FindObject<MyClass1>( code ); if ( myObject == null ) { m

如何使下面的代码成为泛型代码,以便最终使用一个简单的函数代替多个类中的多个函数

下面对FindObject和CreateObject的调用是第三方库的一部分,因此我无法控制这些库的参数,正是在这里我陷入了困境

private MyClass1 FindClass1Object( string code )
{
  MyClass1 myObject = FindObject<MyClass1>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<MyClass1>( );
    myObject.Code = code;
  }

  return myObject;
}

private MyClass2 FindClass2Object( string code )
{
  MyClass2 myObject = FindObject<MyClass2 >( code );

  if ( myObject == null )
  {
    myObject = CreateObject<MyClass2 >( );
    myObject.Code = code;
  }

  return myObject;
}
私有MyClass1 FindClass1对象(字符串代码)
{
MyClass1 myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myObject.Code=代码;
}
返回myObject;
}
私有MyClass2 FindClass2对象(字符串代码)
{
MyClass2 myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myObject.Code=代码;
}
返回myObject;
}
我知道我可以传入一个额外的参数来指定我正在寻找/创建的类型,但是代码在调用FindObject和CreateObject时被卡住了

private object ReadClassFromXml ( string code, Type myType )
{
  object myObject = FindObject<myType>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<myType>( );
    myType.GetProperty("Code").SetValue(myObject, code, null);
  }

  return myObject;
}
私有对象ReadClassFromXml(字符串代码,类型myType)
{
对象myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myType.GetProperty(“代码”).SetValue(myObject,Code,null);
}
返回myObject;
}

要使方法泛型,您需要添加泛型类型定义(
),并且不需要使用第二个指定类型的参数(即不需要使用
类型myType)。您还应该返回泛型类型,而不是
对象
。我还将
myType
重命名为
T
,因为通用参数的名称通常以
T
开头。因此,总体而言,您的代码如下所示:

// Method has generic parameter <T> and returns result of type T:
private T ReadClassFromXml<T>( string code)  
{
  object myObject = FindObject<T>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<T>( );
    myType.GetProperty("Code").SetValue(myObject, code, null);
  }

  return myObject;
}
//方法具有泛型参数并返回类型为T的结果:
私有T ReadClassFromXml(字符串代码)
{
对象myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myType.GetProperty(“代码”).SetValue(myObject,Code,null);
}
返回myObject;
}

请记住,泛型方法可能需要一些。要使方法泛型,您需要添加泛型类型定义(
),并且不需要使用第二个指定类型的参数(即不需要
类型myType)。您还应该返回泛型类型,而不是
对象
。我还将
myType
重命名为
T
,因为通用参数的名称通常以
T
开头。因此,总体而言,您的代码如下所示:

// Method has generic parameter <T> and returns result of type T:
private T ReadClassFromXml<T>( string code)  
{
  object myObject = FindObject<T>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<T>( );
    myType.GetProperty("Code").SetValue(myObject, code, null);
  }

  return myObject;
}
//方法具有泛型参数并返回类型为T的结果:
私有T ReadClassFromXml(字符串代码)
{
对象myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myType.GetProperty(“代码”).SetValue(myObject,Code,null);
}
返回myObject;
}

请记住,泛型方法可能需要一些。像这样简单:

private T FindObject<T>( string code )
{
  T myObject = FindObject<T>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<T>( );
    myObject.Code = code;
  }

  return myObject;
}
private T FindObject(字符串代码)
{
T myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myObject.Code=代码;
}
返回myObject;
}

您还必须实现FindObject和CreateObject

您可以用Generic简单地将其包装起来。像这样简单:

private T FindObject<T>( string code )
{
  T myObject = FindObject<T>( code );

  if ( myObject == null )
  {
    myObject = CreateObject<T>( );
    myObject.Code = code;
  }

  return myObject;
}
private T FindObject(字符串代码)
{
T myObject=FindObject(代码);
if(myObject==null)
{
myObject=CreateObject();
myObject.Code=代码;
}
返回myObject;
}

您还必须实现FindObject和CreateObject

在您的示例中,myObject.Code将抛出一个“Member not found”编译时异常。您将再次陷入遗忘状态,FindObject已经存在。在您的示例中,myObject.Code将抛出一个“Member not found”编译时异常。您将再次被遗忘,
FindObject
已经存在,这一问题非常清楚。如果您在有
Type myType
变量的情况下加入了如何使用反射来调用此方法,那么这将是一个黄金答案。如果您加入了如何使用反射来调用此方法方法如果您有一个
类型myType
变量,那么这将是一个黄金答案。