0

ダウンキャストに問題があります。文字列「Label」をキャスト用のクラス タイプ Label に変換するにはどうすればよいですか?「Texts」クラスに到達することは可能ですか?

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 に答える