Для разных классов мне нужно прикрепить строку к классу (т.е. Class1
имеет строку hello
, Class2
содержит строку world
и т. Д.).Тогда у меня будет параметр общего типа T
где-нибудь, который будет (во время выполнения) одним из этих классов.Мне нужно иметь возможность извлечь связанную строку из этого параметра универсального типа.
Как мне настроить это и заставить его работать?
Поскольку все классы написаныя могу использовать любой возможный подход (например, определить общий интерфейс для них или общий базовый класс или любой другой).
Я попытался создать базовый класс, который имеет открытое статическое поле, содержащее строку, и для каждого фактическогоКласс "перезаписать" (скрыть базу и создать новую) строку.Но оказалось, что я все еще не могу получить строку, когда есть только параметр типа T
.
public class BaseClass
{
public static string Get => "";
}
public class Class1 : BaseClass
{
public static new string Get => "hello";
}
public class Class2 : BaseClass
{
public static new string Get => "world";
}
public class Testing<T> where T : BaseClass
{
public void Test()
{
string s = T.Get;
// compiler error: "'T' is a type parameter, which is not valid in the given context"
// strangely though, BaseClass.Get and Class1.Get and Class2.Get work fine!
}
}
Реальный вариант использования:
У меня есть статический классMySerializer<T>
, который должен десериализовать объекты типа T
.Во время десериализации я хочу проверить, соответствует ли мой объект типа T
схеме, связанной с типом T
.
. Для проверки мне нужно сначала добавить схему.Для каждого класса T
, который можно десериализовать, существует своя схема, которую я храню в своем проекте как встроенный ресурс, поэтому у каждой схемы есть путь (например, путь к файлу).Это означает: для каждого класса T
мне нужно связать строку (путь) с классом, чтобы я мог получить этот путь из T
.
Вот соответствующая часть моегоСериализатор и процесс добавления схемы:
public static class MySerializer<T>
{
private static readonly XmlSerializer _mySerializer = new XmlSerializer(typeof(T));
private static readonly XmlReaderSettings _settings = new Func<XmlReaderSettings>(() =>
{
System.Reflection.Assembly assy = typeof(MySerializer<T>).Assembly;
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(null,
XmlReader.Create(assy.GetManifestResourceStream(T.GetAssociatedString())));
// T.GetAssociatedString(): How to make this work?
return new XmlReaderSettings
{
Schemas = schemas,
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings |
XmlSchemaValidationFlags.ProcessIdentityConstraints
};
})();
public static T Deserialize(Stream strm)
{
using (XmlReader reader = XmlReader.Create(strm, _settings))
{
return (T)_mySerializer.Deserialize(reader);
}
}
}