#c# #oop
#c# #ооп
Вопрос:
У меня есть базовый класс и зависимый.
class A
{
...
}
class B : A
{
...
}
Как я мог бы извлечь объект базового класса из зависимого?
B myDependant = new B();
A myBase = (A) myDependant;
(A)
приведение необязательно, но myBase
объект по-прежнему имеет тип B
. Я хочу myBase
быть типом A
без создания нового объекта.
Комментарии:
1. Что именно вы пытаетесь сделать? Ваш
myDependant
обладает всеми возможностямиA
класса, вы можете передать его в качестве аргумента принимающим методамA
и делать все остальное, что вы могли бы сделать сA
объектом.2. Можете ли вы редактировать классы
A, B
?3. Почему вы хотели бы это сделать? B имеет тип A, поэтому нет необходимости создавать объект A…
4. Неясно, чего вы надеетесь достичь. Пожалуйста, опишите проблему, которую вы пытаетесь решить.
5. Мне нужен объект MyBase типа A, потому что мне нужно было бы сериализовать этот объект в json напрямую. Если объект MyBase имеет тип B, у меня есть больше свойств, но я не могу сериализовать его напрямую.
Ответ №1:
Что ж, вы можете создать свой собственный распознаватель контрактов, который проверит, принадлежит ли свойство определенному типу, и если нет, то пометит его как игнорируемое:
class MyContractResolver<T> : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var list = base.CreateProperties(type, memberSerialization);
var baseProps = typeof(T).GetProperties();
foreach (var prop in list)
{
prop.Ignored = baseProps?.All(p => p.Name != prop.PropertyName) ?? false;
}
return list;
}
}
И используйте его :
var myDependant = new B();
var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver<A>() };
var json = JsonConvert.SerializeObject(myDependant, settings);
Плюсы здесь в том, что ваш класс будет сериализован только один раз, а минусы в том, что в случае, когда A наследуется от другого класса, его свойства также будут сериализованы.
Ответ №2:
Основываясь на вашем последнем комментарии, вы можете сделать что-то вроде этого:
B myDependant = new B();
A myBase = JsonConvert.DeserializeObject<A>(JsonConvert.SerializeObject(myDependant));
Таким образом, myBase
это будет экземпляр A
класса, который вы хотите.