Использовать объект производного класса в базовом классе

У меня есть базовый класс, который содержит вспомогательный метод, и у меня есть некоторые производные классы, которые содержат некоторые виртуальные методы.

Итак, я хочу знать, как я могу использовать производный объект класса в базовых классах виртуальных методов?

производный класс

 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();
    }

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;
}
Другие вопросы по тегам