如何将以下代码设为通用代码,以便最终可以使用单个简单函数代替多个类中的多个函数?
下面对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;
}
答案 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。