Class1
有绳子吗
hello
,
Class2
有绳子吗
world
等等)。然后我将有一个泛型类型参数
T
(在运行时)这些类中的一个。我需要能够从泛型类型参数中检索关联的字符串。
我如何设置并使其工作?
因为所有的类都是由我编写的,所以我可以使用所有可能的方法(例如,为它们定义公共接口或公共基类或其他)。
我尝试创建一个基类,该基类有一个包含字符串的公共静态字段,并为每个实际类“覆盖”(隐藏基类并创建新的)字符串。但是,当我只有type参数时,仍然无法检索字符串
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);
}
}
}