c#-传递get / set属性作为参数而不进行反射的最佳方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-传递get / set属性作为参数而不进行反射的最佳方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1779字,纯文字阅读大概需要3分钟。
内容图文
![c#-传递get / set属性作为参数而不进行反射的最佳方法](/upload/InfoBanner/zyjiaocheng/665/3699a89c6a8248f980c6990a5bbaf250.jpg)
有时,在处理数据传输对象(例如从数据库或csv文件中检索到的对象)时,最好编写一些辅助函数来移动数据.
例如:
class MyDto
{
public string Name { get; set; }
}
class MyBusinessObject
{
public string Name { get; set;}
}
我想写一些类似的东西:
MyDto source;
MyBusinessObject target;
var hasChanged = target.Set(source, source => source.Name, target => target.Name); // lamdba expressions, or whatever it takes to make it work
使用扩展方法:
public static bool Set<TS, TT, TValue>(this TS source, IGetProperty<TS, TValue> sourceGetProperty, IGetOrSetProperty<TT, TValue> targetGetOrSetProperty)
{
var sourceValue = sourceGetProperty.Invoke(source);
var actualValue = targetGetOrSetProperty.Invoke(target);
if(sourceValue != actualValue)
{
targetGetOrSetPropery.Invoke(target, sourceValue);
return true;
}
return false;
}
我组成了IGetProperty和IGetOrSetProperty.是否有可能以某种方式实现它们而不使用反射(以便在编译时检查)?
还是有一种优雅的方式来处理这种情况?
编辑:该示例具有误导性,因为目标不是使用Automapper,而是以某种方式将属性表示为对象.我意识到实际上这与将属性用作“ ref”的想法非常接近,因此,它更多是与语言有关的问题,始终在这里得到回答:Passing properties by reference in C#
解决方法:
没有反射是不可能的,但是表达式lambda可以让您进行编译时检查:
public static bool Set<TTarget, TValue>(
this TTarget target,
Expression<Func<TTarget, TValue>> targetProperty,
TValue sourceValue)
{
var actualValue = targetProperty.Compile().Invoke(target);
if (actualValue.Equals(sourceValue))
{
return false;
}
var property = (PropertyInfo)((MemberExpression)targetProperty.Body).Member;
property.SetValue(target, sourceValue);
return true;
}
用法如下所示:
var hasChanged = target.Set(t => t.Name, source.Name);
工作示例:https://dotnetfiddle.net/CJVxIS
为什么不应该这样做:
> targetProperty.Compile()缓慢,
> Automapper会为您执行此类映射.
内容总结
以上是互联网集市为您收集整理的c#-传递get / set属性作为参数而不进行反射的最佳方法全部内容,希望文章能够帮你解决c#-传递get / set属性作为参数而不进行反射的最佳方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。