Использовать объект производного класса в базовом классе
У меня есть базовый класс, который содержит вспомогательный метод, и у меня есть некоторые производные классы, которые содержат некоторые виртуальные методы.
Итак, я хочу знать, как я могу использовать производный объект класса в базовых классах виртуальных методов?
производный класс
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;
}