Ограничения и имплицитные операторы - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть три класса A, B и C, некоторые свойства есть во всех трех классах, некоторые не

public class A
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int xxx {get; set}   // only in class A
    public int yyy{get; set}    // only in class A
    ... 
}

public class B
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int aaa {get; set} // only in class B
    public int bbb {get; set} // only in class B
    ... 
}

public class C
{ 
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
    public int kkk {get; set} // only in class C
    public int ppp {get; set} // only in class C
    ...
}

Я хочу вызвать метод Execute класса XYZ ...

public class XYZ
{
    public override Execute<T>() where T: Generic_T, new()
    { 
      T abc = new T();
      ...
      Debug.WriteLine(abc.Firstname + ”, “ + abc.Lastname + “, “ + abc.ID);
    }
}

... со всеми тремя классами, например:

XYZ x1 = new XYZ();
XYZ.Execute<A>();

XYZ x2 = new XYZ();
XYZ.Execute<B>();

XYZ x3 = new XYZ();
XYZ.Execute<C>();

Моя идея не работает:

public class Generic_T
{
    public static implicit operator A(Generic_T x)
    { 
        return (A)x.MemberwiseClone();
    }
}

В чем ошибка?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Ошибки:

  1. Что такое CloneMemberwise()?
  2. Если вы имели в виду MemberwiseClone(), вы не можете это там назвать.Это protected член.
  3. Вы не можете вызывать свойства для типа.Здесь: T.Firstname, T.Lastname и т. Д.
  4. Это Debug, а не Degub.
  5. Вы не передаете значение / ссылку в метод Execute,
  6. Ни A, ни B, ни C не являются производными от Generic_T, поэтому ограничение метода Execute не будет выполнено.
  7. Имена классов не заканчиваются на ().У вас есть class A(), который я уже отредактировал.
  8. A или любой класс не может быть автоматически преобразован в Generic_T.
  9. Вы должны использовать наследование, я подозреваю Generic_Tдолжен быть базовым классом.
  10. У вас нет конкретного вопроса

Возможное предложение:

public abstract class Generic_T
{
    public string Firstname {get; set;}
    public string  Lastname {get; set;}
    public int ID {get; set;}
}

public class A : Generic_T
{ 
    public int xxx {get; set}   // only in class A
    public int yyy{get; set}    // only in class A
    ... 
}

public class B : Generic_T
{ 
    public int aaa {get; set}   // only in class B
    public int bbb {get; set} // only in class B
    ... 
}

public class C : Generic_T
{ 
    public int kkk {get; set}   // only in class C
    public int ppp {get; set} // only in class C
    ...
}

Также нет причин конвертировать любой изпроизводные классы до Generic_T, поскольку они уже являются экземпляром Generic_T.

Вся эта информация обычно объясняется в большинстве вводных текстов для C # /. NET.Невозможность их понять сделает вашу жизнь несчастной.

0 голосов
/ 22 февраля 2011

Не знаю, зачем вам Generic_T в вашем коде. Для принудительного выполнения работы вам необходимо реализовать следующий интерфейс

interface IFoo 
{
   int ID {get; set;}
   string LastName {get; set;}
   string FirstName {get; set;}
}

Тогда ваш метод execute будет выглядеть так:

public override Execute<T>(T obj) where T: new(), IFoo
{ 
    Debug.WriteLine(obj.Firstname + ”, “ + obj.Lastname + “, “ + obj.ID);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...