通过接口c#

时间:2019-01-16 10:13:53

标签: c# .net types interface

我需要按相同的值订购多个列表。但是,无论出于何种原因,这些列表都包含共享此值的不同类型的对象。我们称之为 ChildID

简化的模型代码如下所示:

public class Child
{
    public string ChildID { get; set; }
}

public class Parent
{
    public Child Child { get; set; }
}

public class OtherClassID 
{ 
    public int ID { get; set; }
    public string ChildID { get; set; }
}

public class SomeOtherClass
{
    public OtherClassID ID { get; set; }
}

因此,为了避免代码重复,我尝试了以下操作:

public interface IHasChildID
{
    string GetChildID();
}

public class Child : IHasChildID
{
    public string ChildID { get; set; }
    public string GetChildID()
    {
        return ChildID;
    }
}

public class Parent : IHasChildID
{
    public Child Child { get; set; }
    public string GetChildID()
    {
        return Child.ChildID;
    }
}

public class OtherClassID 
{ 
    public int ID { get; set; }
    public string ChildID { get; set; }
}

public class SomeOtherClass : IHasChildID
{
    public OtherClassID ID { get; set; }
    public string GetChildID()
    {
        return ID.ChildID;
    }
}

当我使用带有接口作为参数的helper方法创建了一个helper类时,我希望它可以工作:

public static class ChildOrderHelper
{
    public static IEnumerable<IHasChildID> OrderChildren(IEnumerable<IHasChildID> children)
    {
        var childrenList = children.ToList();
        //do some splitting, ordering and conatenation of lists
        return orderedList;

    }
}

但是,在每个帮助程序调用中,我都会收到一个错误:

List<Child> originalList = GetChildren(); // whatever
// some lines of code
var orderedList = ChildOrderHelper.OrderChildren(originalList).ToList(); // error
  

错误CS1503参数1:无法从中转换   'System.Collections.Generic.List '   'System.Collections.Generic.List '

因此,对于每个助手呼叫,无论类型如何。

要注意的一件事是,我给出了一个示例,其中包含三个具有此值且需要对其进行排序的不同类型。在该项目中,可能有10个或更多。

我猜想我对接口的使用尚不了解,但是对此有任何帮助。

2 个答案:

答案 0 :(得分:2)

我不完全确定您的总体用例是什么,但是使OrderChildren方法通用如下可能会有所帮助:

public static class ChildOrderHelper
{
  public static IEnumerable<T> OrderChildren<T>(IEnumerable<T> children) where T : IHasChildID
  {
    var childrenList = children.ToList();
    //just a simple example of what I'm guessing the method could do...
    return childrenList.OrderBy(c => c.GetChildID()).ToList();
  }
}

并按如下方式调用它:

List<Child> originalList = GetChildren();
List<Child> orderedList = ChildOrderHelper.OrderChildren<Child>(originalList).ToList();

答案 1 :(得分:-1)

可以采用这种方法,就像定义一个接口,然后在所有必需的类或一个可以查找子ID的基类中实施一个实现。

下面是源代码示例。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections;

public class Program
{
    public static void Main()
    {
        var parents = new List<Parent>();
        parents.Add(new Parent{ChildId = "123"});
        parents.Add(new Parent{ChildId = "321"});
        parents.Add(new Parent{ChildId = "456"});

        var result = ChildHelpers.OrderChildren(parents);

        foreach(var res in result) {
            Console.WriteLine(res.ChildId);
        }
        Console.WriteLine("Hello World");
    }
}

public interface IChild {
    string ChildId {get;set;}
}

public class Child : IChild {
    public string Name {get;set;}
    public string ChildId {get;set;}
}

public class Parent : IChild {
    public Parent() {
        child = new Child();
    }
    public Child child {get;set;}
    public string ChildId {
        get{
            return child.ChildId;
        }
        set{
            child.ChildId = value;
        }
    }
}

public class AnotherChild : IChild {
    public string Description{get;set;}
    public string ChildId {get;set;}
}

public static class ChildHelpers {
    public static IEnumerable<IChild> OrderChildren(IEnumerable<IChild> children)
    {
        return children.OrderBy(c=>c.ChildId).AsEnumerable();
    }
}

如果您想在本示例中进行实验,并在需要时查看其他选项,请参阅this链接。