diff --git a/src/dscom/TypeInfoResolver.cs b/src/dscom/TypeInfoResolver.cs index 8b6f0b8..d7b8e70 100644 --- a/src/dscom/TypeInfoResolver.cs +++ b/src/dscom/TypeInfoResolver.cs @@ -25,6 +25,8 @@ internal sealed class TypeInfoResolver : ITypeLibCache private readonly Dictionary _types = new(); + private readonly Dictionary _resolvedTypeInfos = new(); + public WriterContext WriterContext { get; } public TypeInfoResolver(WriterContext writerContext) @@ -67,6 +69,11 @@ public TypeInfoResolver(WriterContext writerContext) public ITypeInfo? ResolveTypeInfo(Type type) { + if (_resolvedTypeInfos.TryGetValue(type, out var typeInfo)) + { + return typeInfo; + } + ITypeInfo? retval; if (type.FullName == "System.Collections.IEnumerator") { @@ -126,6 +133,7 @@ public TypeInfoResolver(WriterContext writerContext) } } } + _resolvedTypeInfos[type] = retval; return retval; } diff --git a/src/dscom/writer/MethodWriter.cs b/src/dscom/writer/MethodWriter.cs index 0508ea3..daf986d 100644 --- a/src/dscom/writer/MethodWriter.cs +++ b/src/dscom/writer/MethodWriter.cs @@ -60,12 +60,20 @@ protected virtual short GetParametersCount() return retVal; } + private bool? _isComVisible; + protected virtual bool IsComVisible { get { + if (_isComVisible != null) + { + return _isComVisible.Value; + } + var methodAttribute = MethodInfo.GetCustomAttribute(); - return methodAttribute == null || methodAttribute.Value; + _isComVisible = methodAttribute == null || methodAttribute.Value; + return _isComVisible.Value; } } diff --git a/src/dscom/writer/PropertyMethodWriter.cs b/src/dscom/writer/PropertyMethodWriter.cs index 61bbdbe..469c2df 100644 --- a/src/dscom/writer/PropertyMethodWriter.cs +++ b/src/dscom/writer/PropertyMethodWriter.cs @@ -26,12 +26,20 @@ public PropertyMethodWriter(InterfaceWriter interfaceWriter, MethodInfo methodIn MemberInfo = _propertyInfo!; } + private bool? _isComVisible; + protected override bool IsComVisible { get { + if (_isComVisible != null) + { + return _isComVisible.Value; + } + var propertyAttribute = MemberInfo.GetCustomAttribute(); - return (propertyAttribute == null || propertyAttribute.Value) && base.IsComVisible; + _isComVisible = (propertyAttribute == null || propertyAttribute.Value) && base.IsComVisible; + return _isComVisible.Value; } }