如何创建Nullable <T>的实例?

hor*_*rgh 6 c# linq generics reflection

假设我们有两个类:

public class ParentEntity
{
    public ChildEntity Child { get; set; }
}

public class ChildEntity
{
    public byte? NullableValue { get; set; }
    public byte Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

任务是在linq表达式中表达以下代码:

parent.Child == null ? null : parent.Child.NullableValue
Run Code Online (Sandbox Code Playgroud)

为此,我尝试使用以下代码:

public static Expression GetCondition<TParent, TChild, TChildKey>(
                              Expression<Func<TParent, TChild>> pe, 
                              Expression<Func<TChild, TChildKey>> ce)
{
    var test = Expression.Equal(pe.Body, Expression.Constant(null));

    var ifTrue = Expression.Constant(Activator.CreateInstance<TChildKey>());
    var ifFalse = Expression.Property(pe.Body, 
                                      (ce.Body as MemberExpression).Member.Name);
    return Expression.Condition(test, ifTrue, ifFalse);
}
Run Code Online (Sandbox Code Playgroud)

运行此代码

Expression<Func<ParentEntity, ChildEntity>> pe = n => n.Child;    

GetCondition(pe, n => n.Value);         // ok
GetCondition(pe, n => n.NullableValue); // throws an ArgumentException
Run Code Online (Sandbox Code Playgroud)

抛出ArgumentException最后一行(在返回语句中GetCondition),表示参数类型不匹配.

在分析这个代码,我发现了Activator.CreateInstance<TChildKey>()回报object,但不是TChildKey,当TChildKeySystem.Nullable<T>,即ifTrue.Type就是object,虽然我希望它是System.Nullable<byte>.

SO中讨论了这个问题:通过Activator.CreateInstance创建一个可以为空的对象返回指向Reflection和Nullable的null

但这些都没有提出解决问题的方法.

有没有办法创建一个确切System.Nullable<T>类型的实例,有价值null?或者也许有其他方式表达原始条件表达式?

Mar*_*zek 2

你应该试试Expression.New

var ifTrue = Expression.New(typeof(Nullable<int>));
Run Code Online (Sandbox Code Playgroud)