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