Skip to content

Commit 5dbea0d

Browse files
committed
Fix certain problems with expressions
- handle DefaultExpression when type is Void and cannot be instantiated - To/FromSerializableForm for methods/members now supports non-public methods/members
1 parent 65d19a6 commit 5dbea0d

3 files changed

Lines changed: 18 additions & 5 deletions

File tree

Orm/Xtensive.Orm/Core/Extensions/ExpressionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public static ConstantExpression ToConstantExpression(this DefaultExpression def
135135
/// <returns>Object value of default value.</returns>
136136
public static object GetDefaultValue(this DefaultExpression defaultExpression)
137137
{
138-
if (defaultExpression.Type.IsValueType) {
138+
if (defaultExpression.Type != typeof(void) && defaultExpression.Type.IsValueType) {
139139
return StructDefaultValues.GetOrAdd<DefaultExpression>(
140140
defaultExpression.Type,
141141
(type, expr) => { return ((Func<object>) Expression.Lambda(Expression.Convert(expr, WellKnownTypes.Object)).Compile()).Invoke(); },

Orm/Xtensive.Orm/Linq/Internals/ExpressionHashCodeCalculator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ protected override int VisitConstant(ConstantExpression c)
6464
protected override int VisitDefault(DefaultExpression d)
6565
{
6666
if (d.Type.IsValueType) {
67-
return d.GetDefaultValue().GetHashCode();
67+
return d.GetDefaultValue()?.GetHashCode() ?? NullHashCode;
6868
}
6969
else {
7070
return NullHashCode;

Orm/Xtensive.Orm/Linq/SerializableExpressions/Internals/ReflectionExtensions.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static string ToSerializableForm(this MethodInfo method)
3030
serializableName += method.ToString();
3131
else
3232
serializableName += method.GetGenericMethodDefinition() + Environment.NewLine +
33-
String.Join(Environment.NewLine,
33+
string.Join(Environment.NewLine,
3434
method.GetGenericArguments().Select(ty => ty.ToSerializableForm()).ToArray());
3535
return serializableName;
3636
}
@@ -42,7 +42,13 @@ public static MethodInfo GetMethodFromSerializableForm(this string serializedVal
4242

4343
var fullName = SplitString(serializedValue);
4444
var name = fullName[1];
45-
var method = Type.GetType(fullName[0]).GetMethods().First(m => m.ToString() == name);
45+
var type = Type.GetType(fullName[0]);
46+
var publicMethods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
47+
var method = publicMethods.FirstOrDefault(m => m.ToString() == name);
48+
if (method == null) {
49+
var nonPublicMethods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
50+
method = nonPublicMethods.First(m => m.ToString() == name);
51+
}
4652

4753
if (method.IsGenericMethod)
4854
method = method.MakeGenericMethod(fullName.Skip(2).Select(s => GetTypeFromSerializableForm(s)).ToArray());
@@ -64,7 +70,14 @@ public static MemberInfo GetMemberFromSerializableForm(this string serializedVal
6470

6571
var fullName = SplitString(serializedValue);
6672
var name = fullName[1];
67-
var member = Type.GetType(fullName[0]).GetMembers().First(m => m.ToString() == name);
73+
var type = Type.GetType(fullName[0]);
74+
var publicMemberss = type.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
75+
var member = publicMemberss.FirstOrDefault(m => m.ToString() == name);
76+
if (member == null) {
77+
var nonPublicMembers = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
78+
member = nonPublicMembers.First(m => m.ToString() == name);
79+
}
80+
6881
return member;
6982
}
7083

0 commit comments

Comments
 (0)