您的位置:首页 > 编程语言 > C#

C#里将运算符按参数传递以及WPF中将属性按引用传递

2013-04-01 10:17 288 查看
一、运算符作为参数传递

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐