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

时间:2016-04-07 04:05:13

标签: c# .net generics

如何将以下代码设为通用代码,以便最终可以使用单个简单函数代替多个类中的多个函数?

下面对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;
}

我知道我可以传入一个额外的参数来指定我正在寻找/创建的类型但是代码会被调用到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;
}

2 个答案:

答案 0 :(得分:6)

要使方法通用,您需要添加泛型类型定义(<myType>),并且不需要使用指定类型的第二个参数(即不需要Type myType)。您还应该返回通用类型,而不是object。我还要将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;
}

请注意,通用方法可能需要一些constraints on type parameters

答案 1 :(得分:-1)

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

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

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

  return myObject;
}

您还必须实现FindObject和CreateObject。