基于角色返回泛型类

时间:2015-04-08 17:25:00

标签: c#

在我目前正在处理的页面上,我需要根据角色返回两种不同的类类型。

这是公开的

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 个答案:

答案 0 :(得分: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不是类型,则会使转换返回null。)

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

答案 1 :(得分:0)

您可以创建一个抽象基类,从中可以派生cpsdatapsdata类,然后可以添加cpsdatapsdata类的实例到包含您派生类型的对象的列表。

P.S那个班级命名惯例太可怕了。

答案 2 :(得分:-4)

如果你真的想快速修复

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

在通用方面显然有很多方法可以解决这个问题,即创建接口或基类以及通用方法,其中T:某个对象,但是,您仍然需要检查其他属性的类型。