C# 比较短语的反思

C# 比较短语的反思,c#,reflection,parameters,comparison,phrase,C#,Reflection,Parameters,Comparison,Phrase,也许我的问题很奇怪。。。我想知道是否可以对一个短语进行反思 我试着用C#中的反射来做比较。到目前为止,我将属性的名称作为字符串传递,将值作为对象传递,如下所示:Cmp(“foo”,“abc”) 这样,我必须检查类中是否存在foo属性,并检查值类型是否与属性类型匹配(在上面的示例中,foo是string属性,值是string)。这样很好用 我只是想知道是否有可能将短语作为参数发送,并通过反射或类似的方式对其进行分析。 我的意思是,在上面的例子中,不要调用像Cmp(“foo”,“abc”)那样的函数

也许我的问题很奇怪。。。我想知道是否可以对一个短语进行反思

我试着用C#中的反射来做比较。到目前为止,我将属性的名称作为字符串传递,将值作为对象传递,如下所示:
Cmp(“foo”,“abc”)

这样,我必须检查类中是否存在
foo
属性,并检查值类型是否与属性类型匹配(在上面的示例中,foo是string属性,值是string)。这样很好用

我只是想知道是否有可能将短语作为参数发送,并通过反射或类似的方式对其进行分析。
我的意思是,在上面的例子中,不要调用像
Cmp(“foo”,“abc”)
那样的函数,只需调用像这样的函数
Cmp(A.foo==“abc”)
A
是具有
foo
属性的类),然后分析属性是
foo
,值是
“abc”

我知道这听起来很奇怪,对我来说也没必要。这只是一个想法。
可能吗

编辑
如果我不清楚,我已经编写了
Cmp(string,string)
方法,它工作得很好
我只是想知道是否有这样的方法来编写
Cmp
方法:
Cmp(A.foo==“abc”)
。参数是一个短语

编辑2
例如,您可以在C中执行类似操作。您可以创建如下宏:

#define Cmp(phrase) printf(##phrase)
然后,如果您像
Cmp(A.foo==“abc”)
那样调用它,则输出将是:

A.foo==“abc”

例如,将整个短语作为参数传递并分析它。我知道宏是预编译的东西,我只是想知道在C#

中是否有类似的东西可以用来描述一个表达式,比如
bar.Foo==“abc”
。下面是一个简单的示例,假设您有一个名为
Bar
的类,该类的属性名为
Foo

String FormatExpression<T>(Expression<Func<T, Boolean>> expression) {
  if (expression == null)
    throw new ArgumentNullException("expression");
  var body = expression.Body as BinaryExpression;
  if (body == null)
    throw new ArgumentException(
      "Expression body is not a binary expression.", "expression");
  return body.ToString();
}
将返回字符串

(bar.Foo == "abc")

这个扩展方法遍历它所调用的对象的所有(可读的、公共的)属性,检查该属性上具有给定名称的属性,并比较这些值

public static class CmpExtension
{
    public static bool Cmp<T, TValue>(this T obj, string propertyName, TValue value)
        where TValue : class
    {
        var properties = obj.GetType().GetProperties()
                .Where(p => p.CanRead);

        foreach (var property in properties)
        {
            var propertyValue = property.GetValue(obj, null);

            var childProperty = property.PropertyType.GetProperties()
                .Where(p => p.CanRead)
                .FirstOrDefault(p => p.Name == propertyName);

            if (childProperty == null) continue;

            var childPropertyValue = childProperty.GetValue(propertyValue, null);

            return childPropertyValue == value;
        }

        return false;
    }
}
要使用替代语法,请使用:

public static class CmpExtension
{
    public static bool Cmp<T>(this T obj, Func<T, bool> func)
    {
        return func(obj);
    }
}

我不明白这个问题。如果可以执行
obj.Foo==“abc”
,那么
Cmp
做什么?很抱歉,我将解决这个问题,包含
Cmp
的类也包含具有
Foo
属性的对象。它应该是
A.foo==“abc”
您可能需要发布更完整的代码才能让它有意义。基本上,您希望循环调用
Cmp
的对象的所有属性,检查它是否有一个名为
foo
的属性,并比较值?我已经编写了
Cmp(string,string)。我只是想知道是否可以像
Cmp(A.foo==“abc”)那样编写它@Someone:我不明白你的问题。你肯定不是在问函数
布尔Cmp(布尔b){return b;}
(它满足你的要求),所以一定有一些细节我遗漏了。我的问题就在这里。如果可以发送孔短语作为参数。我将用CI编写的示例再次编辑
Cmp(字符串,字符串)。我只是想知道是否可以像
Cmp(A.foo==“abc”)那样编写它
public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Value { get; set; }
}

public static void Main(string[] args)
{
    var foo = new Foo { Bar = new Bar { Value = "Testing" } };
    foo.Cmp("Value", "Testing"); // True
}
public static class CmpExtension
{
    public static bool Cmp<T>(this T obj, Func<T, bool> func)
    {
        return func(obj);
    }
}
    public static void Main(string[] args)
    {
        var foo = new Foo { Bar = new Bar { Value = "Testing" } };
        foo.Cmp(f => f.Bar.Value == "Testing"); // True
    }