gpt4 book ai didi

不使用反射的 C# 字符串到对象

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:20 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com