C# 如何获得在Unity中被注入的对象的类型?

C# 如何获得在Unity中被注入的对象的类型?,c#,reflection,dependency-injection,unity-container,C#,Reflection,Dependency Injection,Unity Container,我有一个类型在其构造函数中接收另一个类型,通常是创建它的对象的类型,例如: public class Logger { public Logger(Type parent) { ... } } 我想指示Unity解析Logger将需要它的对象类型作为参数传递给它的构造函数。比如: // ... would be some directive to tell Unity to use the type that /// depends on Logger container.Regist

我有一个类型在其构造函数中接收另一个类型,通常是创建它的对象的类型,例如:

public class Logger {
    public Logger(Type parent) { ... }
}
我想指示Unity解析
Logger
将需要它的对象类型作为参数传递给它的构造函数。比如:

// ... would be some directive to tell Unity to use the type that
/// depends on Logger
container.RegisterType<Logger>(new InjectionConstructor(...));
它将返回:

var logger = new Logger(typeof(MyService));
return new MyService(logger);

可能吗?还有其他方法吗?

实际上,您可以这样做:

internal class Program
{
    static void Main( string[] args )
    {
        var container = new UnityContainer();
        container.RegisterType<IInterface, Implementation>( new MyInjectionConstructor() );

        // this instance will get a logger constructed with loggedType == typeof( Implementation )
        var instance = container.Resolve<IInterface>();
    }
}

internal class MyInjectionConstructor : InjectionMember
{
    public override void AddPolicies( Type serviceType, Type implementationType, string name, IPolicyList policies )
    {
        policies.Set<IConstructorSelectorPolicy>( new MyConstructorSelectorPolicy(), new NamedTypeBuildKey( implementationType, name ) );
    }
}

internal class MyConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy
{
    protected override IDependencyResolverPolicy CreateResolver( ParameterInfo parameter )
    {
        if( parameter.ParameterType == typeof( ILogger ) )
        {
            return new LiteralValueDependencyResolverPolicy( new Logger( parameter.Member.DeclaringType ) );
        }
        return base.CreateResolver( parameter );
    }
}

internal interface ILogger
{
}

internal class Logger : ILogger
{
    public Logger( Type loggedType )
    {
    }
}

internal interface IInterface
{
}

internal class Implementation : IInterface
{
    public Implementation( ILogger logger )
    {
    }
}
内部类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
RegisterType(新的MyInjectionConstructor());
//此实例将获得一个使用loggedType==typeof(实现)构造的记录器
var instance=container.Resolve();
}
}
内部类MyInjectionConstructor:InjectionMember
{
public override void AddPolicies(类型serviceType、类型implementationType、字符串名称、IPolicyList策略)
{
Set(new MyConstructorSelectorPolicy(),new NamedTypeBuildKey(implementationType,name));
}
}
内部类MyConstructorSelectorPolicy:DefaultUnityConstructorSelectorPolicy
{
受保护的重写IDependencySolverPolicy CreateSolver(ParameterInfo参数)
{
if(parameter.ParameterType==typeof(ILogger))
{
返回新的LiteralValueDependencySolverPolicy(新记录器(parameter.Member.DeclaringType));
}
返回base.CreateResolver(参数);
}
}
内部接口ILogger
{
}
内部类记录器:ILogger
{
公共记录器(类型loggedType)
{
}
}
内部接口接口
{
}
内部类实现:IInterface
{
公共实现(ILogger记录器)
{
}
}
这只是概念验证代码,可能需要在生产使用前进行一些改进

internal class Program
{
    static void Main( string[] args )
    {
        var container = new UnityContainer();
        container.RegisterType<IInterface, Implementation>( new MyInjectionConstructor() );

        // this instance will get a logger constructed with loggedType == typeof( Implementation )
        var instance = container.Resolve<IInterface>();
    }
}

internal class MyInjectionConstructor : InjectionMember
{
    public override void AddPolicies( Type serviceType, Type implementationType, string name, IPolicyList policies )
    {
        policies.Set<IConstructorSelectorPolicy>( new MyConstructorSelectorPolicy(), new NamedTypeBuildKey( implementationType, name ) );
    }
}

internal class MyConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy
{
    protected override IDependencyResolverPolicy CreateResolver( ParameterInfo parameter )
    {
        if( parameter.ParameterType == typeof( ILogger ) )
        {
            return new LiteralValueDependencyResolverPolicy( new Logger( parameter.Member.DeclaringType ) );
        }
        return base.CreateResolver( parameter );
    }
}

internal interface ILogger
{
}

internal class Logger : ILogger
{
    public Logger( Type loggedType )
    {
    }
}

internal interface IInterface
{
}

internal class Implementation : IInterface
{
    public Implementation( ILogger logger )
    {
    }
}