2009-05-21 2 views
0

У меня возникли проблемы с общими методами.Общие методы - Дублирование кода

У меня есть два класса, которые генерируются (они абсолютно одинаковы, но я не могу использовать код для использования одного и того же объекта класса).

здесь являются классы:

public class1 : SoapHttpClientProtocol { 
    public partial class notificationsResponse { 

     private ResponseType[] responsesField; 

     private bool ackField; 

     /// <remarks/> 
     public ResponseType[] Responses { 
      get { 
       return this.responsesField; 
      } 
      set { 
       this.responsesField = value; 
      } 
     } 

     /// <remarks/> 
     public bool Ack { 
      get { 
       return this.ackField; 
      } 
      set { 
       this.ackField = value; 
      } 
     } 
    } 
} 

public class2 : SoapHttpClientProtocol { 
    public partial class notificationsResponse { 

     private ResponseType[] responsesField; 

     private bool ackField; 

     /// <remarks/> 
     public ResponseType[] Responses { 
      get { 
       return this.responsesField; 
      } 
      set { 
       this.responsesField = value; 
      } 
     } 

     /// <remarks/> 
     public bool Ack { 
      get { 
       return this.ackField; 
      } 
      set { 
       this.ackField = value; 
      } 
     } 
    } 
} 

как вы можете видеть Class1 и class2 являются одинаковыми; и поскольку они являются встроенными классами, я должен иметь дублирование.

С этими словами в стороне, я пытаюсь вызвать метод обновления с этими типами класса в качестве параметра:

private void UpdateMessageResponses<T>(T results) 
    { 
     T responses = (T)results; 

     foreach (var accts in results.Responses) 
     { 
      int row = GetRowIdByAccountId(accts.ObjectId); 
      if (row != -1) 
      { 
       TestResultsGrid["Status", row].Value = String.Format("{0} {1} - {2} - {3}", accts.ResponseDate, accts.ObjectType, accts.Message, accts.ObjectId); 
      } 
     } 
    } 

как я могу привести результаты правильно, так что я могу получить доступ к свойствам результатов?

+0

Дело в том, что C# generics не являются шаблонами C++. Дженерики действительно _generic_; они сконструированы так, что их можно параметризовать с помощью ЛЮБОГО типа, по модулю определенных ограничений. Вы хотите что-то, что может быть построено только с одним из двух типов; дженерики не предназначены для этого. Ситуация, в которой вы оказались, очень печальна. Если вы могли бы сделать два сгенерированных типа реализовать общий интерфейс, то ваш метод может просто взять ссылку на то, что реализует этот интерфейс. –

ответ

2

Вам необходимо определить интерфейс для свойства Responses, а затем указать, что T должен реализовать этот интерфейс (и что ваши классы реализуют интерфейс).

+0

Спасибо, интерфейс работал; Dunno, почему я забыл о них;) –

1

Возможно, я ошибаюсь, но я не думаю, что вы можете делать это исключительно с помощью дженериков. Единственный способ, которым вы могли бы иметь ограничение на параметр родового типа, но поскольку члены, которые вы хотите получить доступ, не объявляются в базовом классе, который является общим для ваших двух классов, этот вариант исключается, к сожалению.

Смежные вопросы