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
,当TChildKey
为System.Nullable<T>
,即ifTrue.Type
就是object
,虽然我希望它是System.Nullable<byte>
.
在SO中讨论了这个问题:通过Activator.CreateInstance创建一个可以为空的对象返回指向Reflection和Nullable的null
但这些都没有提出解决问题的方法.
有没有办法创建一个确切System.Nullable<T>
类型的实例,有价值null
?或者也许有其他方式表达原始条件表达式?
你应该试试Expression.New
:
var ifTrue = Expression.New(typeof(Nullable<int>));
Run Code Online (Sandbox Code Playgroud)