【问题标题】:use derived class object in base class [closed]在基类中使用派生类对象[关闭]
【发布时间】:2016-10-12 12:16:23
【问题描述】:

我有一个包含辅助方法的基类,并且我有一些包含一些虚拟方法的派生类。

那么,我想知道如何在基类虚拟方法中使用派生类对象?

派生类

 class myclass :baseClass
{
    public string id { get; set; }

    public string name { get; set; }

}

基类

public abstract class baseClass
{

    public virtual object FromStream()
    {
        string name, type;

        List<PropertyInfo> props = new List<PropertyInfo>(typeof(object).GetProperties()); // here I need to use derived class object 

        foreach (PropertyInfo prop in props)
        {
            type = prop.PropertyType.ToString();
            name = prop.Name;

            Console.WriteLine(name + " as "+ type);
        }
        return null;
    }

主要

 static void Main(string[] args)
    {
        var myclass = new myclass();
        myclass.FromStream(); // the object that I want to use it 

        Console.ReadKey();
    }

【问题讨论】:

  • “这里我需要使用派生类对象” - 你是什么意思?我怀疑你可能只是想打电话给GetType().GetProperties()。顺便说一句,即使对于示例代码,遵循 .NET 命名约定也很有帮助 - 并提供 complete 示例代码。 (你的 Main 方法在一个未声明的类中,x 也没有声明......)
  • 真的不清楚你的最终目标是什么。看来您正在尝试构建某种(反)序列化程序。您是否考虑过使用现有的 API?此外,您可以使用someInstance.GetType() 代替typeof(TypeHere) 或泛型。
  • 我希望基类是一个通用类,所以我可以将 fromStream 方法与所有派生类一起使用,所以当我使用基类对象在 main 中调用 fromStream 时,我想使用fromStream 方法中的那个对象

标签: c# inheritance abstract-base-class


【解决方案1】:

由于FromStream 方法是检查对象的properties,我认为您可以使用generics

示例代码:

public abstract class BaseClass
{
    public virtual object FromStream<T>(string line)
    {
        string name, type;

        List<PropertyInfo> props = new List<PropertyInfo>(typeof(T).GetProperties()); 

        foreach (PropertyInfo prop in props)
        {
            type = prop.PropertyType.ToString();
            name = prop.Name;

            Console.WriteLine(name + " as " + type);
        }
        return null;
    }
}

public class MyClass : BaseClass
{
    public string id { get; set; }

    public string name { get; set; }
}

消费:

var myclass = new MyClass();
myclass.FromStream<MyClass>("some string"); 

任何需要检查属性的type都可以通过这样做传入:

public virtual object FromStream<T>(string line)

编辑:还请注意,您可以遵循@Jon Skeet 提到的方法 - 即使用GetType().GetProperties()

在这种情况下,您可以编写FromStream 方法如下:

public virtual object FromStream(string line)
{
    string name, type;

    List<PropertyInfo> props = new List<PropertyInfo>(GetType().GetProperties()); 

    foreach (PropertyInfo prop in props)
    {
        type = prop.PropertyType.ToString();
        name = prop.Name;

        Console.WriteLine(name + " as " + type);
    }
    return null;
}

【讨论】:

  • 效果很好,谢谢
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多