在 C# 中,是否可以根据字符串 获取对象的实例?没有 使用反射?
例如:
Activator.CreateInstance(Type.GetType(objName));
使用反射。
是否可以用不使用反射的“字符串到对象”实现替换工厂类的经典 if\else 结构?
我听说有,但我不明白如果没有反射(reflection)你会怎么做。
最佳答案
有,但这不是一个简单的解决方案。本质上,您创建一个动态方法,然后从中创建一个委托(delegate)并使用它。
public static BaseBuilder Create(Type builderType, HttpContextBase httpContext, PathDataDictionary pathData)
{
if (!builderType.IsSubclassOf(baseBuilderType)) return null;
BuilderConstructorDelegate del;
if (builderConstructors.TryGetValue(builderType.FullName, out del))
return del(httpContext, pathData);
DynamicMethod dynamicMethod = new DynamicMethod("CreateBaseBuilderInstance", builderType, constructorMethodArgs, builderType);
ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Newobj, builderType.GetConstructor(constructorMethodArgs));
ilGenerator.Emit(OpCodes.Ret);
del = (BuilderConstructorDelegate)dynamicMethod.CreateDelegate(typeof(BuilderConstructorDelegate));
builderConstructors.TryAdd(builderType.FullName, del);
return del(httpContext, pathData);
}
这是我在 Builder for ASP.NET 中使用的一些代码
BuilderFactory 中的框架。
如果在代码中不清楚,你应该知道一旦你有一个委托(delegate),那么删除就会存储在上面代码中名为 builderConstructors 的字典中。所以下次工厂简单地使用委托(delegate)。
在这种特殊情况下,该类在其构造函数中需要两个参数。如果你为你的类使用默认构造函数,事情会简单一些。
High Performance Class Factory
关于不使用反射的 C# 字符串到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161271/