我正在锁定一种方法,将我的函数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 { }
}
由于 斯特芬
答案 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
为前缀,那么 应该Liste
,Load
等等。enum
时会有什么用?abstract
的类以及您不希望通过继承sealed
扩展的类。his.Count == 0
和searchString.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");
}
}
}