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");
}

 

posted @ 2013-04-01 10:17  cuero  阅读(431)  评论(0编辑  收藏  举报