C# 从未知类返回字符串

C# 从未知类返回字符串,c#,.net,arrays,object,C#,.net,Arrays,Object,假设我有两门课: 第1类: public class Class1 { public static string Test = "Class1"; } 第二类: public class Class2 { public static string Test = "Class2"; } 现在在我的mainform中,我有一个对象数组: object[] Objects = new object[2]; Objects[0] = new Class1(); Objects[1]

假设我有两门课:

第1类:

public class Class1
{
    public static string Test = "Class1";
}
第二类:

public class Class2
{
    public static string Test = "Class2";
}
现在在我的mainform中,我有一个对象数组:

object[] Objects = new object[2];
Objects[0] = new Class1();
Objects[1] = new Class2();
现在假设我想从对象[0]获取测试字符串 我怎样才能找回它

我试过了

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

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

Console.WriteLine(Class1.Test );
因此,如果对象[0]是Class1 Console.WriteLineClass1.Text,则可以执行此操作;作为一段完整的代码。

您可以

if (object[0] is Class1) { ... }
if (object[1] is Class2) { ... }
Objects[0].GetType().GetField("Test").GetValue(null);
比如

Console.WriteLine(Class1.Test );

因此,如果对象[0]是Class1 Console.WriteLineClass1.Text,则可以执行此操作;作为一段完整的代码。

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

Objects[0].GetType().GetField("Test").GetValue(null);
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;

首先,不能在实例上调用任何声明为静态的对象。其次,这正是多态性的作用

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;

将其强制转换为Class1或使用继承和多态性。让两个类继承相同的基类或实现具有属性测试的相同接口。然后创建这个类/接口的数组,您就可以访问这个属性,而无需强制转换.Class1.Test和Class2.Test?它们是静态属性,您不需要对象来访问它们。您可以使用类名直接访问它们。@TimSchmelter测试是静态的,因此没有继承/多态性…@xanatos:true,它们是字段。但这只是一个例子。也许它们是偶然静止的。我只是想给OP另一种看待事物的方式。反射应该是最后的手段,并且经常被滥用来解决一个如果你理解OOP的概念就不应该存在的问题。此外,现在不应该经常使用对象作为类型。将其转换为Class1或使用继承和多态性。让两个类继承相同的基类或实现具有属性测试的相同接口。然后创建这个类/接口的数组,您就可以访问这个属性,而无需强制转换.Class1.Test和Class2.Test?它们是静态属性,您不需要对象来访问它们。您可以使用类名直接访问它们。@TimSchmelter测试是静态的,因此没有继承/多态性…@xanatos:true,它们是字段。但这只是一个例子。也许它们是偶然静止的。我只是想给OP另一种看待事物的方式。反射应该是最后的手段,并且经常被滥用来解决一个如果你理解OOP的概念就不应该存在的问题。而且,现在不应该经常需要使用对象作为类型。它无法在非静态上下文中访问静态字段测试。因为在非静态类中测试是静态的!纠正了克拉里蒂诺的错误。它无法在非静态上下文中访问静态字段测试。因为在非静态类中测试是静态的!为清晰起见更正了该基类或使用接口,具体取决于两个对象的关联方式。同意,在此给定场景中,接口更合适。该基类或使用接口,具体取决于两个对象的关联方式。同意,在此给定场景中,接口更合适。