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

时间:2013-01-15 00:16:37

标签: c# .net lambda

在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?

2 个答案:

答案 0 :(得分:4)

您可以传递Func<ExampleStruct,bool>

bool DoSomething(ExampleStruct value, Func<ExampleStruct,bool> predicate)
{
    if (predicate(value))
    {
       // Do your thing
    }
}

然后您可以通过以下方式调用此方法:

bool result = DoSomething(toVerify, v => v.IsNice);

答案 1 :(得分:0)

您可以使用枚举器作为第二个参数:

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...
    }    
}

或者您可以将通用函数与谓词一起使用。