4

この関数を使用して、プロパティとネストされたプロパティに値を正常に割り当てました

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を使用する代わりにnull許容値を割り当てる方法は? 例えば

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???
4

2 に答える 2

3

FastMember は型を変換しません。100 は int リテラルですが、対象のプロパティは decimal? 型です。int から 10 進数への暗黙的な変換はありませんか? (または 10 進数)。100.0 は暗黙的に decimal? に変換される Double リテラルであるため、代入は成功します。

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

于 2016-10-28T15:14:45.067 に答える