相关疑难解决方法(0)

如何使用表达式设置属性值?

给出以下方法:

public static void SetPropertyValue(object target, string propName, object value)
{
    var propInfo = target.GetType().GetProperty(propName,
                         BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

    if (propInfo == null)
        throw new ArgumentOutOfRangeException("propName", "Property not found on target");
    else
        propInfo.SetValue(target, value, null);
}
Run Code Online (Sandbox Code Playgroud)

如何编写它的表达式启用等效而无需为目标传递额外的参数?

为什么这样做而不是直接设置属性我可以听到你说.例如,假设我们有以下类,其属性具有公共getter但私有setter:

public class Customer 
{
   public string Title {get; private set;}
   public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我希望能够致电:

var myCustomerInstance = new Customer();
SetPropertyValue<Customer>(cust => myCustomerInstance.Title, "Mr");
Run Code Online (Sandbox Code Playgroud)

现在这里是一些示例代码.

public static void SetPropertyValue<T>(Expression<Func<T, Object>> memberLamda , object value)
{
    MemberExpression memberSelectorExpression; …
Run Code Online (Sandbox Code Playgroud)

c# linq expression

59
推荐指数
1
解决办法
4万
查看次数

如何简化重复if-then-assign构造?

我有以下方法:

protected override bool ModifyExistingEntity(Product entity, ProductModel item)
{
    bool isModified = false;

    if (entity.Title != item.Title)
    {
        isModified = true;
        entity.Title = item.Title;
    }

    if (entity.ServerId != item.Id)
    {
        isModified = true;
        entity.ServerId = item.Id;
    }

    return isModified;
}
Run Code Online (Sandbox Code Playgroud)

我想知道你是否可以建议一种更好的方法来实现该方法.

问题很明显:每个属性有5行几乎复制粘贴的代码太多了.可能是我的愿景中使用Func-s/Expression-s 的解决方案.

.net c# lambda

48
推荐指数
6
解决办法
3446
查看次数

在编译时设置属性而不知道目标类型

我想在编译时不知道对象类型的情况下在对象上设置属性值; 我希望它快速(即每次都不使用反射); 我知道属性名称和类型.

最快的方式(afaik)是使用代表; 所以这就是我到目前为止所拥有的:

class User // this is an example.. Assume I don't know which type this is.
 {
    public string Name {get;set;}   
 }

public static Action<object, object> CreatePropertySetter(Type targetType, string propertyName)
{
    ParameterExpression targetObjParamExpr = Expression.Parameter(targetType);
    ParameterExpression valueParamExpr = Expression.Parameter(targetType.GetProperty(propertyName).PropertyType);

    MemberExpression propertyExpr = Expression.Property(targetObjParamExpr, propertyName);

    BinaryExpression assignExpr = Expression.Assign(targetObjParamExpr, valueParamExpr);

    Action<object, object> result = Expression.Lambda<Action<object, object>>(assignExpr, targetObjParamExpr, valueParamExpr).Compile();
    return result;
}
Run Code Online (Sandbox Code Playgroud)

然后我打电话:

User user = new User();
var userNameSetter = CreatePropertySetter(user.GetType(), "Name");
userNameSetter(user, "Bob");
Run Code Online (Sandbox Code Playgroud)

但是,它不喜欢我传递User类型对象而不是Object的事实,并且失败并且" UserExpression类型'User'不能用于'System.Object'类型的委托参数. …

c# c#-4.0

3
推荐指数
1
解决办法
2382
查看次数

标签 统计

c# ×3

.net ×1

c#-4.0 ×1

expression ×1

lambda ×1

linq ×1