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