złożę inny pogląd na to pytanie. Być może właśnie użyłeś tych właściwości jako przykładu i chcesz mieć właściwości kaskadowe. Ale myślę, że to dobry moment, aby pomyśleć o proponowanym modelu dziedziczenia. Zasadniczo możesz użyć zwykłego dziedziczenia lub pomyśleć o pewnym Wzorcu projektu, który nie może rozwiązać problemu związanego z serializacją, ale może zaoferować ci jeszcze więcej "luźnego sprzężenia" w twojej aplikacji, czyniąc go modelem bardziej składowym i pozwalają każdej klasie zajmować się tylko tym, co jest problemem, w ten sposób można ponownie wykorzystać wiele rzeczy i ułatwić sobie życie.
W oparciu o to myślenie przedstawiamy próbkę wzoru dekoracyjnego Decorator połączonego ze Wzorem Strategii. Gdybym był rozwój klasy jak te na próbkę, to jak chciałbym to zrobić:
/// <summary>
/// The interface for validation strategy (since we are using interface, there is no need for another abstract class)
/// </summary>
public interface IValidation
{
bool IsValid { get; set; }
}
/// <summary>
/// The decorator (it dont need to be abstract) that has the serializable properties
/// </summary>
[Serializable]
public class ValidatableDecorator : IValidation
{
protected IValidation instance;
public ValidatableDecorator()
{
Init();
}
public ValidatableDecorator(IValidation instance)
{
Init();
}
protected virtual void Init() { }
public void Set(IValidation instance)
{
this.instance = instance;
}
[XmlIgnore]
public bool IsValid
{
get
{
return instance.IsValid;
}
set
{
instance.IsValid = value;
}
}
}
Następnie trzeba wdrożyć kilka klas, które mają logikę Wzór strategii, tak:
public class BossValidatorImplementation : IValidation
{
public bool IsValid
{
get
{
return false; ;
}
set
{
throw new InvalidOperationException("I dont allow you to tell me this!");
}
}
}
public class EasyGoingValidator : IValidation
{
public bool IsValid { get; set; }
}
teraz, gdy mamy logikę oddzielony od klasy, możemy odziedziczyć od dekoratorów, wybierając strategię Wich używają pola isValid, tak:
public class ChildWithBossValidation : ValidatableDecorator
{
protected ChildWithBossValidation(IValidation instance)
: this()
{
Init();
}
public ChildWithBossValidation()
: base(new BossValidatorImplementation())
{
Init();
}
protected override void Init()
{
Name = "I'm the boss!";
Sallary = 10000d;
}
public string Name { get; set; }
public double Sallary { get; set; }
}
public class ChildWithEasyGoingValidation : ValidatableDecorator
{
public ChildWithEasyGoingValidation()
: base(new EasyGoingValidator())
{
}
protected ChildWithEasyGoingValidation(IValidation instance)
: this()
{
}
protected override void Init()
{
Name = "Do as you please... :) ";
}
public string Name { get; set; }
}
jest to kod t O pokazują, że rozwiązanie działa:
public static void Main(string[] args)
{
var boos = new ChildWithBossValidation();
var coolGuy = new ChildWithEasyGoingValidation();
using (var ms = new MemoryStream())
{
var ser = new XmlSerializer(boos.GetType());
ser.Serialize(ms, boos);
string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine("With override");
Console.WriteLine(result);
}
Console.WriteLine("-------------");
using (var ms = new MemoryStream())
{
var ser = new XmlSerializer(coolGuy.GetType());
ser.Serialize(ms, coolGuy);
string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine("With override");
Console.WriteLine(result);
}
Console.ReadKey();
}
Wynikiem jest:
{<?xml version="1.0"?>
<ChildWithBossValidation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>I'm the boss!</Name>
<Sallary>10000</Sallary>
</ChildWithBossValidation>-------------------<?xml version="1.0"?>
<ChildWithEasyGoingValidation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Do as you please... :) </Name>
</ChildWithEasyGoingValidation>}
Więc może to nie odpowiadać jak kaskady atrybut w tym przypadku (bo można łatwo zrobić poprzez tworzenie własny atrybut (oznaczenie umożliwiające dziedziczenie), a następnie implementacja kodu do SerializeXML). Jest to kolejna opcja, która może poprawić ogólną architekturę rozwiązań wykorzystujących wzór projektu.Ale to rozwiązuje również ten problem :)
Jeśli "XmlIgnoreAttribute" zostało zadeklarowane z 'Inherited = true', powinno to działać. Niestety, tak nie jest i nie jest to sposób, aby to zadziałało: http://ideone.com/B0KASa '[AttributeUsageAttribute (AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = true) ] public class XmlInheritIgnoreAttribute: System.Xml.Serialization.XmlIgnoreAttribute { } ' –
@ TIMS. Wypróbowałem twój kod i jak słusznie zasugerowałeś, to nie działało w tej sytuacji prawdopodobnie dlatego, że nie jest do tego przeznaczone? – Abhinav
@hhinav Wystarczająco fair, nie zdawałem sobie sprawy. –