C# C-使用谓词选择属性

C# C-使用谓词选择属性,c#,linq,lambda,C#,Linq,Lambda,在这种情况下,我希望将属性的名称作为参数传递给方法,以便该方法可以调用它 我知道我可以通过反射来实现这一点,但这有点过分了——而且很复杂,因为我想要的是什么。所以我进行了更多的探索,发现了谓词的奇妙之处 这基本上就是我想要做的,请记住,这是一个最基本的,快速组合的例子 public class ContainingParentClassWithProperties { public PackagedClassWithProperty OptionOne { get; se

在这种情况下,我希望将属性的名称作为参数传递给方法,以便该方法可以调用它

我知道我可以通过反射来实现这一点,但这有点过分了——而且很复杂,因为我想要的是什么。所以我进行了更多的探索,发现了谓词的奇妙之处

这基本上就是我想要做的,请记住,这是一个最基本的,快速组合的例子

public class ContainingParentClassWithProperties {
    public PackagedClassWithProperty OptionOne {
        get; set;
    } = new PackagedClassWithProperty {
        DesiredTargetProperty = "1"
    };

    public PackagedClassWithProperty OptionTwo {
        get; set;
    } = new PackagedClassWithProperty {
        DesiredTargetProperty = "2"
    };
}
包含属性的对象类型的基本包装

然后是一种可以接受它们的方法

public void TryAcceptPredicateMethod(Predicate<ContainingParentClassWithProperties> p) {
    Console.WriteLine(p.DesiredTargetProperty);
}
我遇到了两个主要问题

1.无法转换lambda 当我尝试调用该方法时,出现以下错误:

无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

我真的不知道这是什么意思。虽然我不太精通lambda的表达方式

2.调用预定属性 试着写下/打电话给我的目标财产是行不通的;它告诉我谓词不包含DesiredTargetProperty的定义

总的来说,我很困惑。有人能帮我澄清一下吗?

你不应该用谓词。在我的评论中,请进一步了解谓词

但在这里,我认为你可以这样做

public void TryAcceptPredicateMethod(Func<PackagedClassWithProperty> p) {
    Console.WriteLine(p.DesiredTargetProperty);
}

public void TryCallAcceptPredicateMethod() {
    // n should be a variable or something in the type of ContainingParentClassWithProperties 
    TryAcceptPredicateMethod(() => n.OptionOne);
}

将属性定义为

public class PropertyContainingClass
{
    public int MyProperty
    {
        get
        {
            if(isRunningLocal)
            {
                return 1;
            }
            else
            {
                return 2;
            }
        }
    }
    private bool isRunningLocal{ get; set; }
    public PropertyContainingClass()
    {
        this.isRunningLocal = //code to determine whether running local
    }
}

如果您喜欢,类可以是静态的

请阅读和。它们不是为这个而设计的。你能解释一下你期望做什么吗?因为我认为您的困惑源于这样一个事实,即您认为它会为您做一些事情,但事实并非如此。@DRKblade-我将详细阅读它们,谢谢。@nvoigt基本上,我有一个类定义应用程序各个部分的属性。这些属性的变化取决于应用程序是在本地运行还是在远程服务器上运行。我需要能够通过DI容器传递这些属性的特定版本,并且由于某些原因,使用新实例和仅将对象作为参数传递是不起作用的。为什么不能使用相同的属性并让DIC加载不同的类,这取决于它是远程的还是本地的?你可能想问一个真正的问题,这似乎更像是一个XY问题。这是我需要完成的,是的。我只是误解了谓词的作用。Func似乎完全适合我需要做的事情。这在一些需要它的情况下非常有效。再次感谢你。多亏了我在这里学到的东西,我能够重新构造一些代码,使其变得更好。
public class PropertyContainingClass
{
    public int MyProperty
    {
        get
        {
            if(isRunningLocal)
            {
                return 1;
            }
            else
            {
                return 2;
            }
        }
    }
    private bool isRunningLocal{ get; set; }
    public PropertyContainingClass()
    {
        this.isRunningLocal = //code to determine whether running local
    }
}