0

我有一个向下转换的问题,如何将字符串“标签”转换为类类型标签进行转换,是否可以到达“文本”类?

public class GFXObject
{
   // Constructor etc...
}
public class Label : GFXObject
{
    public Texts Text = new TextClass();

    // Constructor etc...
}

public class Button : GFXObject
{
    // Constructor etc...
}

public class Texts
{
    public string Text = "empty";

    // Constructor etc...
}

// My List of objects
Dictionary<string, GFXObject> objects;

// Disregarding any troubleshooting
public void ChangeText(string classtype, string name, string text)
{
    // How do I convert the string classtype to a ClassType
    ((classtype)objects[name]).Text.Text = text;

    // If parameters would be equal to "Label", "label", "changed":
    // ((Label)objects["label"].Text.Text = "changed";
}

如果扩展或修改,是否可以使用 ChangeText 函数?

4

2 回答 2

1

您只能通过反射来做到这一点:

public void ChangeText(string classtype, string name, string text)
{
    var type = Type.GetType(classtype);
    type.GetProperty("Text").SetValue(objects[name], text);
}

请注意,classtype如果方法与类型位于不同的程序集中,则该名称必须是程序集限定名称。如果它在同一个程序集中,则需要完全限定,即包括命名空间。

如果这是一个问题,您可以摆脱classtype参数并使用此方法:

public void ChangeText(string name, string text)
{
    var type = objects[name].GetType();
    type.GetProperty("Text").SetValue(objects[name], text);
}

另一种可能性是使用 DLR 和dynamic关键字:

public void ChangeText(string name, string text)
{
    dynamic item = objects[name];
    item.Text = text;
}

请注意,每个使用动态item变量的代码仅在运行时进行评估。这意味着即使Text该特定项目没有属性,此代码也会编译。然后它将在运行时抛出异常。


说了这么多,这个问题的正确解决方案是引入一个持有该Text属性的基类或接口。

于 2012-12-16T17:42:43.093 回答
0

如果使用的类数量很少,另一种解决方案可能是创建一个帮助器来设置属性,例如:

public void ChangeText(string classtype, string name, string text)
{
    switch(classtype)
    {
       case "ClassType1":
          ((ClassType1)objects[name]).Text = text;
          break;
       case "ClassType2":
          ((ClassType2)objects[name]).Text = text;
          break;
       etc...
       default:
          throw new InvalidOperationException("ClassType {0} is not supported", classtype); 
}
于 2012-12-16T17:53:06.060 回答