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

标签 c# reflection dependency-injection

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

相关文章:

Java 9 webstart JNLP服务产生IllegalAccess

java - 将 Groovy Grails 服务注入(inject) Java 类

缓存所有方法的结果

java - 通过反射调用@Transactional方法时未创建Spring事务

c# - IDisposable 对象的依赖注入(inject)和生命周期

android - Dagger2 中如何工作方法注入(inject)

c# - ASP.NET 中的文本到语音 - 访问被拒绝......该怎么办?

c# - 当数据库只有 1 个小数位 C# MVC Postgres 时,DropDownList 显示 4 个小数位

c# - 我可以创建一个网络服务来流式传输 pdf 以供下载吗

c# - Azure 函数 - 在 Azure 存储中找不到方法