字符串的C#类实例化

时间:2020-05-14 22:20:36

标签: c#

我有一个以字符串形式接收的类名,因此我必须实例化该类并进行处理。我可以使用以下代码实例化该类,但如何将实例转换为存储在字符串中的实际类名?

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

(如何转换为动态的并存储在字符串中的实际类)。 请帮助。

3 个答案:

答案 0 :(得分:0)

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

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

class MyService
{
    public int MyProperty { get; set; }     
}

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

尽管反射非常昂贵,您可以使用expression trees创建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

答案 1 :(得分:0)

动态关键字有所帮助。而不是使用 var service = Activator.CreateInstance(objectType); 我用了 动态服务= Activator.CreateInstance(objectType); 正如方言所建议的

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

答案 2 :(得分:0)

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

类定义:

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

一种方法:

string programType = "DynamicPriceProjectV2.Program";
var programObj = Assembly.GetExecutingAssembly().CreateInstance(programType);
相关问题