早上好,
我需要与第三方合作的2个对象。这些对象几乎完全相同(至少我需要访问的部分是。目前我有单独的方法来处理每个对象,我希望看到,在你的亲切的帮助下,如果我可以将其转换为可以使用的泛型处理这两个对象。
public static ObjectOut Method1(Object1 obj1)
{
if (obj1.ErrorCode == 0)
{
//do something
}
}
public static ObjectOut Method2(Object1 obj2)
{
if (obj2.ErrorCode == 0)
{
//do something
}
}
如果我将其转换为单个通用方法,我将如何访问" ErrorCode"对象的属性?任何帮助或指导将不胜感激。
由于
答案 0 :(得分:2)
如果两种类型的对象都有一个共同的超类型,你甚至不需要泛型:
public static ObjectOut Method(ICommonInterfaceWithErrorCodeProperty obj)
{
if (obj.ErrorCode == 0)
{
//do something
}
}
如果属性恰好具有相同的名称,则可以重构代码,使“公共代码”位于单独的方法中。我会举两个例子:
DoSomething
是一个很常见的障碍。DoSomething
需要访问对象的属性。在第一种情况下,您只需提取DoSomething
:
public static ObjectOut Method1(Object1 obj1)
{
if (obj1.ErrorCode == 0)
{
return DoSomething();
}
}
public static ObjectOut Method2(Object1 obj2)
{
if (obj2.ErrorCode == 0)
{
return DoSomething();
}
}
public static ObjectOut DoSomething() { ... }
在第二种情况下,您将提取所需的所有值并将其传递给常用方法:
public static ObjectOut Method1(Object1 obj1)
{
return Method(obj1.ErrorCode);
}
public static ObjectOut Method2(Object2 obj1)
{
return Method(obj2.ErrorCode);
}
public static ObjectOut Method(int errorCode)
{
if (errorCode == 0)
{
...
}
}
如果需要在对象上执行方法,可以将lambdas传递给Method
。
(显然,你需要修复一个事实,即如果错误代码非零,你的方法不会返回任何内容。但我想编译器已经告诉过你了。)
答案 1 :(得分:0)
如果他们有任何类似的父... ...像接口或抽象基类?然后你可以使用where
约束说
public static ObjectOut Method1<T>(T obj1) where T : IBaseObject
{
if (obj1.ErrorCode == 0)
{
//do something
}
}
如果没有,那么您将必须投射它并相应地访问
public static ObjectOut Method1<T>(T obj1)
{
if(obj1 is Object1)
{
if (((Object1)obj1).ErrorCode == 0)
{
//do something
}
}
}
答案 2 :(得分:0)
要做你想做的事,你需要他们拥有定义了ErrorCode
的父(类或接口)。如果这样做,您可以执行通用帮助程序类,例如:
public static class MyHelperClass<T> where T : TheCommonParent
{
public static ObjectOut Method(T obj)
{
if (obj.ErrorCode == 0)
{
//do something
}
}
}
如果您希望您的ObjectOut不同,您可能需要在类定义中使用第二个泛型类型,但根据您的问题没有足够的信息可以确定。
答案 3 :(得分:0)
我假设这两个类没有一个包含所有需要成员的公共基类/接口......
你能做的就是围绕那两个暴露所有需要成员的对象编写一个包装器,并在内部将所有内容交给你当前处理的对象
类似
public class wrapper {
private ClassA objA;
private ClassB objB;
public wrapper(ClassA obj)
{
objA=obj;
}
public wrapper(ClassB obj)
{
objB=obj;
}
public int? Property1
{
get
{
return objA?.Property1 ?? objB?.Property1;
}
}
}