【问题标题】:Convert a user inputted string to a class that gets cast将用户输入的字符串转换为可以转换的类
【发布时间】:2015-10-04 23:57:48
【问题描述】:

我有一个用户输入的字符串。该字符串可能类似于:Button.Minimize 或 Hyperlink.SomeLink

我需要获取字符串的第一部分并将其转换为位于 dll 库中的类。然后我需要将其转换为一种类型。

我在这里看到了无数的例子,但没有一个显示如何将字符串转换为任何类型。我看到的所有示例都是当您事先知道要将字符串转换为哪种类型时。

基本上我需要一个将字符串转换为任何类型的类名的方法。喜欢:按钮、超链接等...

    public static void ClickOn(Step step)
    {
        string[] kvp = step.Element.Split('.');

        var type = kvp[0];
        var element = kvp[1];

        GetType(type);

        var path = MainWin.Get<type>(element); //inputted string would be cast in this line where you see <type>

        path.Click();
    }

    public static Type GetType(string typeName)
    {
        Type get = Type.GetType(typeName, true);
        Object type = (Activator.CreateInstance(get));

        return type;
    }

【问题讨论】:

  • 如果您动态创建的类型不共享接口或抽象类,您将如何对待它们?假设您收到 Button 并设法拥有它: Button b = ...;你要对b做什么?如果从方法中返回它,则处理程序将不是 Button 类型。
  • 我想我不是很清楚。在我拥有的代码中: var path = MainWin.Get 应该是输入的字符串。
  • 是的,我明白了,但是您的 GetType 方法无法编译,因为您声明要返回一个 Type 对象并且您正在返回一个 Object 对象。 Activator.CreateInstance 正在创建您指定类型的对象。 GetTypeMethod 应该返回 Object,但问题是我在第一条评论中描述的,你打算如何处理 Object 类型的对象?您的处理程序路径将是 Object 类型,您没有 Click 方法。
  • 阅读我的回答,如果您需要的话,请告诉我。

标签: c# string gettype


【解决方案1】:

如果你的意思是像(string)anObject 那样投射,那么就没有办法做到这一点。以这种方式进行转换是一种编译时活动,它使编译器能够了解它正在使用的类型。由于您所描述的本质上是一个运行时活动,因此编译器目前无能为力。

如果您写了一个不同的问题来更详细地描述您尝试解决的问题(或更改此问题),那么有人可能会建议一种方法来完成您想要的。

【讨论】:

  • 在我拥有的代码中: var path = MainWin.Get 应该是输入的字符串。
【解决方案2】:

使用 Click 方法定义名为 IClickable 的接口,并使所有类都实现该接口。将您的方法 GetType 重命名为 GetClickableObject 并使该方法返回 IClickable。像这样的:

public static void ClickOn(Step step)
    {
        // get type
        string fullClassType = ...;    
        IClickable obj = MainWin.GetClickableObject(fullClassType);

        obj.Click();
    }

    public static IClickable GetClickableObject(string typeName)
    {
        Type get = Type.GetType(typeName, true);
        IClickable obj = (IClickable)Activator.CreateInstance(get);

        return obj;
    }
}

interface IClickable 
{
       void Click();
}

class Button : IClickable 
{
    //...
}

【讨论】:

  • 不幸的是,我马上就知道这对我的特定问题不起作用。我正在使用一个名为 TestStack.White 的库来设置一个可以自动化桌面应用程序的框架。虽然我认为你的答案就足够了,但它不会削减它。图书馆的课程不适用于您的答案。无论如何,谢谢你的帮助。
  • 您是否考虑向类添加扩展方法(如果它们无法实现接口)并使用反射调用这些方法?
猜你喜欢
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2012-05-06
  • 2019-09-06
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多