如何提供要在函数中使用的字段

本文关键字:字段 函数 何提供 | 更新日期: 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...
    }    
}

或者您可以使用带谓词的泛型函数