我有一个以字符串形式接收的类名,因此我必须实例化该类并进行处理。我可以使用以下代码实例化该类,但如何将实例转换为存储在字符串中的实际类名?
string serviceObjectToInstantiate = shared.GetServiceName(screenName) + ", Prefill Service";
var objectType = Type.GetType(serviceObjectToInstantiate);
var service = Activator.CreateInstance(objectType);
(如何转换为动态的并存储在字符串中的实际类)。 请帮助。
答案 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); 正如方言所建议的
答案 2 :(得分:0)
您的意思是,您知道字符串中的类名称,想要通过反射创建实例吗?
类定义:
namespace DynamicPriceProjectV2
{
class Program
{.....}
}
一种方法:
string programType = "DynamicPriceProjectV2.Program";
var programObj = Assembly.GetExecutingAssembly().CreateInstance(programType);