C#里将运算符按参数传递以及WPF中将属性按引用传递
一、运算符作为参数传递
C++中是有std::less和std::greater运算符的,但是C#里没有,所以就需要自己先定义。
static class Functor { static Func<T, T, bool> Greater<T>() where T : IComparable<T> { return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) > 0; }; } static Func<T, T, bool> Less<T>() where T : IComparable<T> { return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) < 0; }; } }
然后可以按如此的方法调用:
void DoWork(Func<int, bool> myOperator, int arg1, int arg2) { if (myOperator(arg1, arg2)) { /* perform rest of work */ } } void main() { DoWork(Functor.Less<int>(), 100, 200); DoWork(Functor.Greater<int>(), 100, 200); }
二、按引用传递WPF中的属性
这点是不可行的,但是有这么几种方法可以绕开它以达到目的。比如可以将想赋的值作为返回值返回,或者用如下两种方法:
//使用 delegate void GetString(string input, Action<string> setOutput) { if (!string.IsNullOrEmpty(input)) { setOutput(input); } } void Main() { var person = new Person(); GetString("test", () => person.Name, value => person.Name = value); Debug.Assert(person.Name == "test"); }
或者
//Linq Expression void GetString<T>(string input, T outObj, Expression<Func<T, string>> outExpr) { if (!string.IsNullOrEmpty(input)) { var expr = (MemberExpression) outExpr.Body; var prop = (PropertyInfo) expr.Member; prop.SetValue(outObj, input, null); } } void Main() { var person = new Person(); GetString<Person>("test", person, x => x.Name); Debug.Assert(person.Name == "test"); }