从字符串实例化的 C# 类

  • 本文关键字:实例化 字符串 c#
  • 更新时间 :
  • 英文 :


我有一个以字符串形式接收的类名,所以我必须实例化该类并执行这些操作。 我可以使用以下代码实例化类,但是如何将实例转换为存储在字符串中的实际类名???

string serviceObjectToInstantiate = shared.GetServiceName(screenName) + ", Prefill Service";
var objectType = Type.GetType(serviceObjectToInstantiate);
var service = Activator.CreateInstance(objectType); 

(如何强制转换为动态并存储在字符串中的实际类(。 请帮忙..

你不能强制转换为任何有意义的东西,因为你在运行时不知道类型,除非你所有的服务都实现某个接口或有一些父共同祖先,然后你强制转换为它,你可以访问它的属性/方法。

如果您的服务没有共同点,但您希望它们具有具有特定名称的属性/方法,则可以像这样执行一些反射魔法:

class MyService
{
public int MyProperty { get; set; }     
}
var x = typeof(MyService).GetProperty("MyProperty")
.GetGetMethod()
.Invoke(new MyService { MyProperty = 5}, null); // sets x to 5

尽管反射非常昂贵,并且您可以通过使用表达式树创建 lambda 并以某种方式缓存它来提高性能(但我会检查仅缓存 MethodInfo(:

var type = typeof(MyService);
var method = type.GetProperty(nameof(MyService.MyProperty)).GetGetMethod();
var param = Expression.Parameter(typeof(object));
var call = Expression.Call(Expression.Convert(param, type),  method);
// this func should be cached
var func = Expression.Lambda<Func<object, int>>(call, param).Compile(); 
var x = func(new MyService { MyProperty = 5}); // sets x to 5

动态关键字有所帮助。 而不是使用 var service = Activator.CreateInstance(objectType(; 我用了 dynamic service = Activator.CreateInstance(objectType(; 正如辩证法所建议的那样

参考 [https://jeremylindsayni.wordpress.com/2019/02/11/instantiating-a-c-object-from-a-string-using-activator-createinstance-in-net/][1]

你的意思是,你知道字符串中的类名,想通过反射创建一个实例吗?

类定义:

namespace DynamicPriceProjectV2
{
class Program
{.....}
}

在蛾子里:

string programType = "DynamicPriceProjectV2.Program";
var programObj = Assembly.GetExecutingAssembly().CreateInstance(programType);

最新更新