【问题标题】:C# Class Instantiation from string [duplicate]来自字符串的 C# 类实例化 [重复]
【发布时间】:2020-05-15 09:58:39
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么需要投射?
  • 我不能直接使用服务对象,就像不能使用任何方法或属性一样。
  • var service = Activator.CreateInstance(objectType);在上面的行之后我想说 service. 或 service.propertyName 但我没有得到任何东西所以我认为 createinstance 必须是某种类型。
  • 编译时不知道类型。你怎么知道有什么方法或属性。你可以通过反思找出答案,但赢得了什么?你希望他们实现一个接口吗?
  • @user3395226 为什么你认为propertyName 会存在于这个对象类型上?它们都实现了一些接口还是有一些父共同祖先?

标签: c#


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    动态关键字有帮助。而不是使用 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]

    【讨论】:

      【解决方案3】:

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

      类定义:

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

      在一个方法中:

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

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        相关资源
        最近更新 更多