2015-04-08 3 views
1

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

Это публичное

public class psdata 
    { 
     public int ID { get; set; } 
     public string Address { get; set; } 
     etc... 
} 

Это является управление

public class cpsdata 
    { 
     public int ID { get; set; } 
     public string Customer { get; set; } 
     public string Address { get; set; } 
     etc... 
} 

как я могу создать функцию, которая будет возвращать класс мне нужно делать, когда, например, список.

List<psdata> ld = new List<psdata>(); 

Где psdata может быть либо psdata, либо cpsdata?

+3

Вопрос может быть более общим: как объявить переменную или параметр так, чтобы он принимал более одного типа? – Kjata30

ответ

3

Ваши классы должны разделять общий интерфейс или общий базовый класс. Ниже приведен пример реализации интерфейса, могут быть также сделаны расширения одного класса

public interface IData { /** common elements **/ void Foo(); } 

public class psdata : IData 
{ 
     public int ID { get; set; } 
     public string Address { get; set; } 
     etc... 
     public void Foo() { 
      // psdata specific 
     } 
} 

public class cpsdata : IData 
{ 
     public int ID { get; set; } 
     public string Customer { get; set; } 
     public string Address { get; set; } 
     etc... 
     public void Foo() { 
      // cpsdata specific 
     } 
} 

Примечание:Foo может быть все, что ведут себя по-другому.

Теперь вы можете создать список IData и вернуть его.

public List<IData> Elements() { 
    List<IData> ld = new List<IData>(); 
    ld.Add(new psdata()); 
    ld.Add(new cpsdata()); 
    return ld; 
} 

Если вы хотите использовать некоторые специфические свойства/методы элементов, которые вы можете сделать распаковка

1) Использование is ключевого слова и после этого сделать отливать к этому типа ,

foreach(var element in ld) { 
    if(element is psdata) { 
     var elementPSData = (psdata) element; 
     /** do something **/ 
    } 

2) Использование as ключевого слова (это сделать бросало возвращение нулевого значение, если элемент is не то, что типа).

var elementData = element as cpsdata; 
    if(elemntData != null) { 
     /** do something **/ 
    } 
+0

Возможно, вы также захотите добавить, что страница может использовать оператор 'is' в объекте' List', чтобы выяснить, какой производный тип используется. – Kjata30

+0

@ Kjata30 хорошая идея: P, я добавлю это тоже: D. – adricadar

+0

Вам все равно придется отдать его в свой конкретный класс, чтобы получить доступ к свойствам без IDATA. И вопрос сказал «два разных класса». – Vincent

0

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

P.S Это соглашение об именах классов является ужасным.

-4

Если вы действительно хотите быстро исправить

List<Object> ld = new List<Object>(); 
foreach(Object obj in ld) 
{ 
    //check object type and take appropriate action 
} 

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

+0

Yuck. Чтобы на самом деле использовать свойства или методы любого «объекта» в списке таким образом, вам нужно сначала напечатать контрольный список, а затем бросить каждый объект? Нет, спасибо; просто используйте решение для интерфейса adricadar. – Kjata30

+1

Вы должны бросать независимо. – Vincent