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

Woo*_*tsu 0 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以传入一个额外的参数来指定我正在寻找/创建的类型但是然后代码卡在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;
}
Run Code Online (Sandbox Code Playgroud)

dot*_*tom 6

要使方法通用,您需要添加泛型类型definition(<myType>),而不需要使用指定类型的第二个参数(即Type myType不需要).您还应该返回泛型类型,而不是object.我也会重命名myTypeT,因为通常用名称开头的通用参数命名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;
}
Run Code Online (Sandbox Code Playgroud)

请记住,泛型方法可能需要对类型参数进行一些约束.