如何将集合中的方法用作其他类的泛型方法

时间:2016-09-05 12:27:37

标签: c# generics collections

我正在锁定一种方法,将我的函数GetItem用作其他类的泛型方法。这些类都基于CBase,我使用GetItem方法将近20个类。在20个类中唯一不同的是classtype。在这个例子中是classtype CLoad。

我会使用函数GetItem作为泛型方法,但我没有看到这样做的方法。目前我将此功能复制到每个班级。

我希望有更好的方法。

using System.Collections.ObjectModel;
using System.Data;
using System.Linq;

namespace WindowsFormsGenerics
{
    public class CLoadListe : Collection<CLoad>
    {
        ///<param name="Searchstring"> String nach dem die Lastenliste durchsucht werden soll </param>
        ///<param name="Parameter"> NAME für Lastenname, ALIASNAME oder DESCRIPTION</param>
        public CLoad GetItem(string Searchstring, string Parameter = "NAME")
        {
            if (this.Count == 0) return null;
            if (Searchstring.Length == 0) return null;
            switch (Parameter)   // Parameter auswerten
            {
                case ("NAME"): return this.Where(item => item.Name == Searchstring).FirstOrDefault();
                case ("DESCRIPTION"): return this.Where(item => item.Description == Searchstring).FirstOrDefault();
                default: throw new System.Exception($"Suchparameter {Parameter} nicht vorhanden");
            }
        }

    }

    /// <summary>Basisklasse für alle Elemente </summary>
    public class CBase
    {
        /// <summary> Elementname </summary>
        public string Name { get; set; }
        /// <summary> Beschreibung </summary>
        public string Description { get; set; }
    }
    public class CKnoten : CBase { }
    public class COneNodeElement : CBase
    {
        /// <summary> KnotenOne des Elementes </summary>
        public CKnoten KnotenOne { get; set; }
        /// <summary> Schaltzustand am KnotenOne </summary>
        public bool SwitchOne { get; set; }
    }
    public class CLoad : COneNodeElement { }


}

由于 斯特芬

3 个答案:

答案 0 :(得分:2)

为您的列表添加基类:

public abstract class CListe<T> : Collection<T>
    where T : CBase
{
    public T GetItem(string Searchstring, string Parameter = "NAME")
    {
        // As is...
    }
}

现在LoadListe只是:

public sealed CLoadListe : CListe<CLoad> { }

但是我在这里强调一些小问题:

  • 在C#中,通常类不以C为前缀,那么 应该ListeLoad等等。
  • 参数通常是camelCase。
  • 您不需要字符串参数,当您拥有enum时会有什么用?
  • 你的课程都不是抽象的,没有密封。使您不希望实例化abstract的类以及您不希望通过继承sealed扩展的类。
  • 您对t his.Count == 0searchString.Length == 0的测试无效,this.Where()将在没有它们的情况下按要求执行(它可能是微优化的尝试,但会降低常见路径性能) 。您可能希望添加参数检查(例如searchString null抛出ArgumentNullException)。
  • 如果您有更好的异常类型,请不要抛出通用Exception。在这种情况下,您可以使用ArgumentException(或InvalidEnumArgumentException,如果切换为enum)。
  • 鉴于我放弃了参数Parameter,你也正在进行序数比较,并不总是你所期望的或你可能知道的。如果你真的必须坚持使用字符串,最好使用String.Equals()StringComparison.InvariantCultureIgnoreCase

答案 1 :(得分:1)

这应该有效:

var list = new CLoadListe();
var items = list.GetItem("searchstring", "parameter");

您现在可以这样打电话:

/data/data/com.test.internalstorage/files

答案 2 :(得分:-1)

您可以编写扩展方法

public static class CLoadExtension
{
    public static CLoad GetItem(this Collection<CLoad> coll, string Searchstring, string Parameter = "NAME")
    {
        if (this.Count == 0) return null;
            if (Searchstring.Length == 0) return null;
            switch (Parameter)   // Parameter auswerten
            {
                case ("NAME"): return this.Where(item => item.Name == Searchstring).FirstOrDefault();
                case ("DESCRIPTION"): return this.Where(item => item.Description == Searchstring).FirstOrDefault();
                default: throw new System.Exception($"Suchparameter {Parameter} nicht vorhanden");
            }
    }
}