Skip to content

Different Proxy #1218

@kaylumah

Description

@kaylumah
public class TestProxy
    {
        readonly IServiceProvider _ServiceProvider;

        public TestProxy(IServiceProvider serviceProvider)
        {
            _ServiceProvider = serviceProvider;
        }

        public TContract Create<TContract>() where TContract : notnull
        {
            TContract instance = _ServiceProvider.GetRequiredService<TContract>();
            return instance;
        }
        
        public TContract Create<TContract>(Type type, params object[] parameters)
        {
            object instance = ActivatorUtilities.CreateInstance(_ServiceProvider, type, parameters);
            if (instance is TContract instanceAsContract)
            {
                return instanceAsContract;
            }

            throw new InvalidOperationException();
        }
    }
bool IsProxyableClass(Type type)
{
    return !type.IsSealed
        && (type.IsPublic || type.IsNestedPublic)
        && type.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                .Any(m => m.IsVirtual && !m.IsFinal);
}
bool IsClassProxyable(Type type)
{
    if (type.IsInterface)
        return true; // handled separately

    if (type.IsSealed)
        return false;

    if (!type.IsPublic && !type.IsNestedPublic)
        return false;

    if (type.IsAbstract)
        return false;

    if (type.IsGenericTypeDefinition)
        return false;

    // Must have at least one accessible constructor
    var hasCtor = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                      .Any(c => c.IsPublic || c.IsFamily || c.IsAssembly);
    if (!hasCtor)
        return false;

    // Must have at least one virtual method (optional, but good to check)
    var hasVirtuals = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                          .Any(m => m.IsVirtual && !m.IsFinal && !m.IsStatic);
    return hasVirtuals;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions