向需要用于泛型的方法传递参数
本文关键字:方法 参数 用于 泛型 | 更新日期: 2023-09-27 18:17:36
我目前正在研究一个位于StructureMap之上的IoC容器抽象。这个想法是,它也可以与其他IoC容器一起工作。
public interface IRegister
{
IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments);
}
public abstract class ContainerBase : IRegister
{
public abstract IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments);
}
public class StructureMapContainer : ContainerBase
{
public StructureMapContainer(IContainer container)
{
Container = container;
}
public IContainer Container { get; private set; }
public override IRegister RegisterType(Type serviceType, Type implementationType, params Argument[] arguments)
{
// StructureMap specific code
Container.Configure(x =>
{
var instance = x.For(serviceType).Use(implementationType);
arguments.ForEach(a => instance.CtorDependency<string>(a.Name).Is(a.Value));
});
return this;
}
}
public class Argument
{
public Argument(string name, string value)
{
Name = name;
Value = value;
}
public string Name { get; private set; }
public string Value { get; private set; }
}
我可以执行以下代码:
//IContainer is a StructureMap type
IContainer container = new Container();
StructureMapContainer sm = new StructureMapContainer(container);
sm.RegisterType(typeof(IRepository), typeof(Repository));
当我试图传入构造函数参数时,问题出现了。StructureMap允许你流畅地链接任意多的CtorDependency调用,但需要构造函数参数名、值和类型。我可以这样写:
sm.RegisterType(typeof(IRepository), typeof(Repository), new Argument("connectionString", "myConnection"), new Argument("timeOut", "360"));
这段代码的工作原理是CtorDependency当前的类型是string,并且两个参数都是字符串
instance.CtorDependency<string>(a.Name).Is(a.Value)
我如何传递多个构造函数参数,但任何类型的这个方法?这可能吗?
您可以使用动态的匿名对象来传递参数。然后使用反射来检查属性。值可以是任意类型
dynamic example = new
{
a = 3,
b = "hello"
};
foreach (PropertyInfo p in example.GetType().GetProperties())
{
string key = p.Name;
dynamic value = p.GetValue(example, null);
Console.WriteLine("{0}: {1}", key, value);
}
输出
: 3你好
根据需要修改即可。
编辑:这样就清楚了。您的注册方法将采用动态参数。应该是这样的。我没有StructureMap,但这应该让你在正确的方向。
public override IRegister RegisterType(Type serviceType, Type implementationType, dynamic arguments)
{
// StructureMap specific code
Container.Configure(x =>
{
var instance = x.For(serviceType).Use(implementationType);
foreach (PropertyInfo p in arguments.GetType().GetProperties())
{
string key = p.Name;
object value = p.GetValue(arguments, null);
instance.CtorDependency<string>(key).Is(value));
}
});
return this;
}
编辑第二部分:
你希望能够传递任何数据类型的键。这样更接近你需要的吗?你通过名字得到方法,通过调用MakeGenericMethod
把它变成封闭泛型。然后调用它。
var method = instance
.GetType()
.GetMethod("CtorDependency")
.MakeGenericMethod(new Type[] { key.GetType() });
method.Invoke(instance, new object[] { key });