Skip to content

Commit

Permalink
fix: unable to register views for externally loaded modules (#1847)
Browse files Browse the repository at this point in the history
* bug: fix unable to register views for externally loaded modules
  • Loading branch information
glennawatson committed Dec 1, 2018
1 parent f49cc40 commit 39abffe
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 19 deletions.
54 changes: 36 additions & 18 deletions src/ReactiveUI/Expression/Reflection.cs
Expand Up @@ -25,8 +25,29 @@ public static class Reflection
private static readonly MemoizingMRUCache<string, Type> typeCache = new MemoizingMRUCache<string, Type>(
(type, _) =>
{
return Type.GetType(type, false);
}, 20);
return Type.GetType(
type,
assemblyName =>
{
var assembly = AppDomain.CurrentDomain.GetAssemblies().Where(z => z.FullName == assemblyName.FullName).FirstOrDefault();
if (assembly != null)
{
return assembly;
}
try
{
return Assembly.Load(assemblyName);
}
catch
{
return null;
}
},
null,
false);
},
20);

/// <summary>
/// Uses the expression re-writer to simplify the Expression down to it's simplest Expression.
Expand All @@ -52,7 +73,7 @@ public static string ExpressionToPropertyNames(Expression expression)

StringBuilder sb = new StringBuilder();

foreach (var exp in expression.GetExpressionChain())
foreach (Expression exp in expression.GetExpressionChain())
{
if (exp.NodeType != ExpressionType.Parameter)
{
Expand Down Expand Up @@ -100,7 +121,7 @@ public static string ExpressionToPropertyNames(Expression expression)
FieldInfo field = member as FieldInfo;
if (field != null)
{
return (obj, args) => field.GetValue(obj);
return (obj, _) => field.GetValue(obj);
}

PropertyInfo property = member as PropertyInfo;
Expand Down Expand Up @@ -147,7 +168,7 @@ public static string ExpressionToPropertyNames(Expression expression)
FieldInfo field = member as FieldInfo;
if (field != null)
{
return (obj, val, args) => field.SetValue(obj, val);
return (obj, val, _) => field.SetValue(obj, val);
}

PropertyInfo property = member as PropertyInfo;
Expand Down Expand Up @@ -193,7 +214,7 @@ public static string ExpressionToPropertyNames(Expression expression)
public static bool TryGetValueForPropertyChain<TValue>(out TValue changeValue, object current, IEnumerable<Expression> expressionChain)
{
var expressions = expressionChain.ToList();
foreach (var expression in expressions.SkipLast(1))
foreach (Expression expression in expressions.SkipLast(1))
{
if (current == null)
{
Expand Down Expand Up @@ -232,7 +253,7 @@ public static bool TryGetAllValuesForPropertyChain(out IObservedChange<object, o
var expressions = expressionChain.ToList();
changeValues = new IObservedChange<object, object>[expressions.Count()];

foreach (var expression in expressions.SkipLast(1))
foreach (Expression expression in expressions.SkipLast(1))
{
if (current == null)
{
Expand All @@ -242,9 +263,7 @@ public static bool TryGetAllValuesForPropertyChain(out IObservedChange<object, o

var sender = current;
current = GetValueFetcherOrThrow(expression.GetMemberInfo())(current, expression.GetArgumentsArray());
var box = new ObservedChange<object, object>(sender, expression, current);

changeValues[currentIndex] = box;
changeValues[currentIndex] = new ObservedChange<object, object>(sender, expression, current);
currentIndex++;
}

Expand Down Expand Up @@ -276,7 +295,7 @@ public static bool TryGetAllValuesForPropertyChain(out IObservedChange<object, o
public static bool TrySetValueToPropertyChain<TValue>(object target, IEnumerable<Expression> expressionChain, TValue value, bool shouldThrow = true)
{
var expressions = expressionChain.ToList();
foreach (var expression in expressions.SkipLast(1))
foreach (Expression expression in expressions.SkipLast(1))
{
var getter = shouldThrow ?
GetValueFetcherOrThrow(expression.GetMemberInfo()) :
Expand All @@ -291,7 +310,7 @@ public static bool TrySetValueToPropertyChain<TValue>(object target, IEnumerable
}

Expression lastExpression = expressions.Last();
var setter = shouldThrow ?
Action<object, object, object[]> setter = shouldThrow ?
GetValueSetterOrThrow(lastExpression.GetMemberInfo()) :
GetValueSetterForProperty(lastExpression.GetMemberInfo());

Expand All @@ -316,7 +335,7 @@ public static Type ReallyFindType(string type, bool throwOnFailure)
{
lock (typeCache)
{
var ret = typeCache.Get(type);
Type ret = typeCache.Get(type);
if (ret != null || !throwOnFailure)
{
return ret;
Expand All @@ -335,16 +354,15 @@ public static Type ReallyFindType(string type, bool throwOnFailure)
/// <exception cref="Exception">If there is no event matching the name on the target type.</exception>
public static Type GetEventArgsTypeForEvent(Type type, string eventName)
{
var ti = type;
var ei = ti.GetRuntimeEvent(eventName);
Type ti = type;
EventInfo ei = ti.GetRuntimeEvent(eventName);
if (ei == null)
{
throw new Exception($"Couldn't find {type.FullName}.{eventName}");
}

// Find the EventArgs type parameter of the event via digging around via reflection
var eventArgsType = ei.EventHandlerType.GetRuntimeMethods().First(x => x.Name == "Invoke").GetParameters()[1].ParameterType;
return eventArgsType;
return ei.EventHandlerType.GetRuntimeMethods().First(x => x.Name == "Invoke").GetParameters()[1].ParameterType;
}

/// <summary>
Expand All @@ -360,7 +378,7 @@ public static void ThrowIfMethodsNotOverloaded(string callingTypeName, object ta
var missingMethod = methodsToCheck
.Select(x =>
{
var methods = targetObject.GetType().GetTypeInfo().DeclaredMethods;
IEnumerable<MethodInfo> methods = targetObject.GetType().GetTypeInfo().DeclaredMethods;
return Tuple.Create(x, methods.FirstOrDefault(y => y.Name == x));
})
.FirstOrDefault(x => x.Item2 == null);
Expand Down
2 changes: 1 addition & 1 deletion src/ReactiveUI/View/DefaultViewLocator.cs
Expand Up @@ -213,4 +213,4 @@ private IViewFor AttemptViewResolution(string viewTypeName, string contract)
}
}
}
}
}

0 comments on commit 39abffe

Please sign in to comment.