首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nullable<T>给FastMember赋值

使用Nullable<T>给FastMember赋值
EN

Stack Overflow用户
提问于 2016-10-28 13:53:15
回答 2查看 939关注 0票数 4

我已经成功地使用此函数为Properties和nested分配了值

代码语言:javascript
复制
private static void AssignValueToProperty(ObjectAccessor accessor, object value, string propertyLambdaString)
{
    var index =  propertyLambdaString.IndexOf('.');

    if (index == -1)
    {
        accessor[propertyLambdaString] = value;
        // problem above: throws Exception if assigning value to Nullable<T>
    }
    else
    {
        var property = propertyLambdaString.Substring(0, index);
        accessor = ObjectAccessor.Create(accessor[property]);

        AssignValueToProperty(accessor, value, propertyLambdaString.Substring(index + 1));
    }
}

但是,分配会抛出一个InvalidCastException。如何使用FastMember分配可空值?例如

代码语言:javascript
复制
public class A
{
  public double? SomeValue {get; set;}
}

...
var a = new A();
var accessor = ObjectAccessor.Create(a);
accessor["SomeValue"] = 100; // throws Exception, when assigning 100.0 it works???
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-01 16:14:36

FastMember在其工具箱中与类型转换无关,因此我为FastMember ObjectAccessor提供了作为扩展方法的解决方案

代码语言:javascript
复制
public static class FastMemberExtensions
{
    public static void AssignValueToProperty(this ObjectAccessor accessor, string propertyName, object value)
    {
        var index = propertyName.IndexOf('.');

        if (index == -1)
        {
            var targetType = Expression.Parameter(accessor.Target.GetType());
            var property = Expression.Property(targetType, propertyName);

            var type = property.Type;
            type = Nullable.GetUnderlyingType(type) ?? type;
            value = value == null ? GetDefault(type) : Convert.ChangeType(value, type);
            accessor[propertyName] = value;
        }
        else
        {
            accessor = ObjectAccessor.Create(accessor[propertyName.Substring(0, index)]);
            AssignValueToProperty(accessor, propertyName.Substring(index + 1), value);
        }
    }

    private static object GetDefault(Type type)
    {
        return type.IsValueType ? Activator.CreateInstance(type) : null;
    }
}

可以这样称呼:

代码语言:javascript
复制
var accessor = ObjectAccessor.Create(t); // t is instance of SomeType
accessor.AssignValueToProperty("Nested.Property", value); // t.Nested.Property = value
票数 6
EN

Stack Overflow用户

发布于 2016-10-28 15:14:45

FastMember不会为您转换类型。100是一个int文字,但目标属性的类型是十进制?没有从int到十进制的隐式转换吗?(或十进制)。100.0是一个双文本,隐式转换为小数点,因此赋值将成功。

代码语言:javascript
复制
public class A
{
    public double? SomeValue { get; set; }
}

public static class Sample
{
    public static void Go()
    {
        var a = new A();
        var accessor = ObjectAccessor.Create(a);
        accessor["SomeValue"] = 100.0; // succeeds
        accessor["SomeValue"] = 100M; // succeeds
        accessor["SomeValue"] = null; // succeeds
        accessor["SomeValue"] = 100; // throws, can't convert from int to decimal?
    }
}

如果没有隐式转换,则必须在代码中执行必要的转换。

隐式转换:

https://msdn.microsoft.com/en-us/library/y5b434w4.aspx

明确转换:

https://msdn.microsoft.com/en-us/library/yht2cx7b.aspx

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40306591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档