访问泛型类型的属性

时间:2017-04-26 14:55:43

标签: c#

早上好,

我需要与第三方合作的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"对象的属性?任何帮助或指导将不胜感激。

由于

4 个答案:

答案 0 :(得分:2)

如果两种类型的对象都有一个共同的超类型,你甚至不需要泛型:

public static ObjectOut Method(ICommonInterfaceWithErrorCodeProperty obj)
{
    if (obj.ErrorCode == 0)
    {
        //do something
    }
}

如果属性恰好具有相同的名称,则可以重构代码,使“公共代码”位于单独的方法中。我会举两个例子:

  1. DoSomething是一个很常见的障碍。
  2. DoSomething需要访问对象的属性。
  3. 在第一种情况下,您只需提取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; 
      } 
   } 
}