【问题标题】:Return String from Unknown Class从未知类返回字符串
【发布时间】:2016-03-10 12:49:02
【问题描述】:

假设我有 2 节课:

第 1 类:

public class Class1
{
    public static string Test = "Class1";
}

第二类:

public class Class2
{
    public static string Test = "Class2";
}

现在在我的主窗体中,我有一个对象数组:

object[] Objects = new object[2];
Objects[0] = new Class1();
Objects[1] = new Class2();

现在说我想从object[0] 获取Test 字符串 我将如何检索它?

我试过了

Objects[0].GetType().GetProperty("Test");  //Returns a NullReference

【问题讨论】:

  • 将其转换为Class1 或使用继承和多态。让两个类继承相同的基类或实现具有属性Test 的相同接口。然后创建一个此类/接口的数组,您可以在不强制转换的情况下访问此属性。
  • Class1.TestClass2.Test?它们是静态属性,您不需要对象来访问它们。您可以使用类名直接访问它们。
  • @TimSchmelter Teststatic,所以没有继承/多态性...
  • @xanatos:是的,它们是字段。但这只是一个例子。也许它们是意外静态的。我只是想为 OP 提供另一种看待事物的方式。反射应该是最后的手段,并且经常被滥用来解决如果您了解 OOP 的概念就不应该存在的问题。此外,现在不应该经常需要使用Object 作为类型。

标签: c# .net arrays object


【解决方案1】:

首先,您不能在实例上调用任何声明为静态的东西。其次,这正是多态性的用途。

public interface IClass
{
    string Test { get; }
}

public class Class1 : IClass
{
    public string Test
    {
        get { return "Class1"; }
    }
}

public class Class2 : IClass
{
    public string Test
    {
        get { return "Class2"; }
    }
}


IClass[] Objects = new IClass[2];
Objects[0] = new Class1();
Objects[1] = new Class2();

那你就可以了。

var str = Objects[0].Test;

【讨论】:

  • 要么(基类)要么使用接口,这取决于你的两个对象是如何相关的。
  • 同意,在这个给定的场景中,界面会更合适。
【解决方案2】:

你可以的

if (object[0] is Class1) { ... }
if (object[1] is Class2) { ... }

比如

Console.WriteLine(Class1.Test );

所以你可以将if (Objects[0] is Class1) Console.WriteLine(Class1.Text); 当作一整段代码。

【讨论】:

  • 没有。它不能在非静态上下文中访问静态字段Test。因为Test 在非静态类中是静态的!
  • 为清晰起见更正
【解决方案3】:
Objects[0].GetType().GetField("Test").GetValue(null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多