如何提供要在函数中使用的字段
本文关键字:字段 函数 何提供 | 更新日期: 2023-09-27 17:52:58
类似Linq的OrderBy的东西,你可以指定用来排序的键。
为了使事情更具体,在我的例子中,我有一个等效的结构体,有两个bool属性,一个。isnice和另一个。ispretty;然后,我希望能够做一个函数返回是否一个实例是漂亮的或是好的。
我可以得到两个函数, bool itIsPretty (ExampleStruct toVerify);
bool itIsNice (ExampleStruct toVerify);
然而,两者本质上是一样的!两者都只不过是返回验证。(IsPretty/IsNice),我不想有一个复制和粘贴功能。
另一种方法是:
bool isItNiceOrPretty (ExampleStruct toVerify, bool checkForNiceness)
{
if (checkForNiceness) return toVerify.IsNice;
else return toVerify.IsPretty;
}
但是,如果不止这两种类型呢?好吧,我可以把这个bool参数变成一个整数,或者一个字符串,但是我需要保存一个表,里面有所有的键值和它们各自的字段…当我添加和/或删除示例结构体的字段时,这可能会导致混乱和反直觉性,以至于我甚至不想再考虑它。
那么,有没有一种方法可以做到我所想的,来创建这样一个灵活的函数?或者我必须坚持使用可怕的Ctrl+C Ctrl+V?
您可以传入一个Func<ExampleStruct,bool>
:
bool DoSomething(ExampleStruct value, Func<ExampleStruct,bool> predicate)
{
if (predicate(value))
{
// Do your thing
}
}
你可以通过:
bool result = DoSomething(toVerify, v => v.IsNice);
可以使用枚举数作为第二个形参:
public enum CheckType
{
Nice,
Pretty,
// And so on...
}
public Boolean IsWhat(ExampleStruct struct, CheckType type)
{
switch (type)
{
case CheckType.Pretty:
return toVerify.IsPretty;
// And so on...
}
}
如果你有不同的结构,你可以实现一个共同的接口:
public interface ILook
{
Boolean IsNice { get; }
Boolean IsPretty { get; }
}
public struct ExampleStructA : ILook { }
public Boolean IsWhat(ILook tiVerify, CheckType type)
{
switch (type)
{
case CheckType.Pretty:
return toVerify.IsPretty;
// And so on...
}
}
或者您可以使用带谓词的泛型函数