public DeputyBase GetOrCreateNativeReference(ByRefValue byRefValue) { if (!_references.ContainsKey(byRefValue.Value)) { ConstructorInfo constructorInfo = GetByRefConstructor(); _references[byRefValue.Value] = (DeputyBase)constructorInfo.Invoke(new object[] { byRefValue }); } return(_references[byRefValue.Value]); ConstructorInfo GetByRefConstructor() { Type type = _types.GetClassType(byRefValue.FullyQualifiedName); // If type is an interface or abstract class if (type == null || type.IsAbstract) { type = _types.GetProxyType(byRefValue.FullyQualifiedName); } if (type == null) { throw new ArgumentException( $"Could not find type with fully qualified name '{byRefValue.FullyQualifiedName}'", nameof(byRefValue) ); } BindingFlags constructorFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; return(type.GetConstructor(constructorFlags, null, new[] { typeof(ByRefValue) }, null)); } }
bool TryConvertCustomType(IReferenceMap referenceMap, object value, bool isOptional, string fullyQualifiedName, out object result) { if (IsReferenceType()) { return(TryConvertClass(referenceMap, value, out result)); } if (_types.GetEnumType(fullyQualifiedName) != null) { return(TryConvertEnum(value, isOptional, fullyQualifiedName, out result)); } result = null; return(false); bool IsReferenceType() { return (_types.GetClassType(fullyQualifiedName) != null || _types.GetInterfaceType(fullyQualifiedName) != null || _types.GetProxyType(fullyQualifiedName) != null); } }