C# - 未调用继承 class 中覆盖的受保护方法
C# - Overridden protected method in inheriting class not called
这是一个与 C# 对象继承相关的问题,但在 受保护方法 Newtonsoft.Json.Serialization.DefaultContractResolver[的上下文中=26=]
我遵循了这个 post 关于如何使用映射属性使用 Newtonsoft 库进行序列化的建议。 DefaultContractResolver usage
我创建了 classes AbstractContractResolver、AbstractContractResolverFromFile、CustomClassImplementedContractResolver (此处自定义命名是为了举例)
public abstract class AbstractContractResolver : DefaultContractResolver{
protected Dictionary<string, string> PropertyMappings {get { return this.getPropertyMappings(); }}
protected override string ResolvePropertyName(string propertyName)
{
string resolvedName = null;
var resolved = this.getPropertyMappings().TryGetValue(propertyName, out resolvedName);
return (resolved) ? propertyName : base.ResolvePropertyName(propertyName);
}
}
public abstract class AbstractContractResolverFromFile : AbstractContractResolver{
public AbstractContractResolverFromFile(string mapperFileName){
if(string.IsNullOrEmpty(mapperFileName)){
throw new InvalidOperationException(string.Format("The abstract class {0} uses a mapper file as input to resolve and populate properties. Please specify a valid mapper file!", this.GetType()));
}
this.MapperFileName = mapperFileName;
}
protected new virtual string ResolvePropertyName(string propertyName)
{
string field = propertyName;
if(this.PropertyMappings.Any() && this.PropertyMappings.ContainsKey(propertyName)){
field = this.PropertyMappings[propertyName];
}
else{
field = base.ResolvePropertyName(propertyName);
}
return field;
}
public class CustomClassImplementedContractResolver : AbstractContractResolverFromFile{
public CustomClassImplementedContractResolver (string mapperFileName) : base(mapperFileName){
}
protected override string ResolvePropertyName(string propertyName)
{
return base.ResolvePropertyName(propertyName);
}
CustomClassImplementedContractResolver继承了AbstractContractResolverFromFile,后者又继承了另一个class等等。
我是这样用的:
string mapperfile = "filepath/to/file.json";
CustomClassImplementedContractResolver contractResolver = new CustomClassImplementedContractResolver(mapperfile);
// Custom implementation to store mappings (PropertyName, FieldSource) in a Dictionary<string, string>
await contractResolver.PopulatePropertyMappings();
// Reading JSON and deserializing
using(TextReader tr = new StreamReader(jsonfile)){
string jsoncontent = await tr.ReadToEndAsync();
try{
var settings = new JsonSerializerSettings();
// Set the ContractResolver
settings.ContractResolver = contractResolver;
var item = JsonConvert.DeserializeObject<CustomClass>(jsoncontent, settings);
问题 -
Please have a look at my implementations of the protected function ResolvePropertyName
in all these classes above and help me find the issue.
我 认为 我错误地覆盖了 - 并且 new
正在进一步覆盖的方法...
无法获取我(从文件)创建的自定义映射,因为调用了不正确的 ResolvePropertyName
...
执行DeserializeObject时,代码内部调用了ResolvePropertyName
,但是当前的contractResolver
并没有调用重写的方法,它实际上调用了第一个碱基 AbstractContractResolver.ResolvePropertyName
。
换句话说,我在所有4个函数(包括CustomClassImplementedContractResolver.ResolvePropertyName
)中都设置了断点,但它只执行了AbstractContractResolver
函数。
奇怪的是:我使用 Visual Studio 代码并在 base.ResolvePropertyName
上按 F12 从每个继承函数到 base.
在AbstractContractResolverFromFile
变化
protected new virtual string ResolvePropertyName
至
protected override string ResolvePropertyName
新的东西隐藏了继承的实现,我通常建议避免它。这是需要注意的事情,因为您可能会在代码中遇到它。
这是一个与 C# 对象继承相关的问题,但在 受保护方法 Newtonsoft.Json.Serialization.DefaultContractResolver[的上下文中=26=]
我遵循了这个 post 关于如何使用映射属性使用 Newtonsoft 库进行序列化的建议。 DefaultContractResolver usage
我创建了 classes AbstractContractResolver、AbstractContractResolverFromFile、CustomClassImplementedContractResolver (此处自定义命名是为了举例)
public abstract class AbstractContractResolver : DefaultContractResolver{
protected Dictionary<string, string> PropertyMappings {get { return this.getPropertyMappings(); }}
protected override string ResolvePropertyName(string propertyName)
{
string resolvedName = null;
var resolved = this.getPropertyMappings().TryGetValue(propertyName, out resolvedName);
return (resolved) ? propertyName : base.ResolvePropertyName(propertyName);
}
}
public abstract class AbstractContractResolverFromFile : AbstractContractResolver{
public AbstractContractResolverFromFile(string mapperFileName){
if(string.IsNullOrEmpty(mapperFileName)){
throw new InvalidOperationException(string.Format("The abstract class {0} uses a mapper file as input to resolve and populate properties. Please specify a valid mapper file!", this.GetType()));
}
this.MapperFileName = mapperFileName;
}
protected new virtual string ResolvePropertyName(string propertyName)
{
string field = propertyName;
if(this.PropertyMappings.Any() && this.PropertyMappings.ContainsKey(propertyName)){
field = this.PropertyMappings[propertyName];
}
else{
field = base.ResolvePropertyName(propertyName);
}
return field;
}
public class CustomClassImplementedContractResolver : AbstractContractResolverFromFile{
public CustomClassImplementedContractResolver (string mapperFileName) : base(mapperFileName){
}
protected override string ResolvePropertyName(string propertyName)
{
return base.ResolvePropertyName(propertyName);
}
CustomClassImplementedContractResolver继承了AbstractContractResolverFromFile,后者又继承了另一个class等等。
我是这样用的:
string mapperfile = "filepath/to/file.json";
CustomClassImplementedContractResolver contractResolver = new CustomClassImplementedContractResolver(mapperfile);
// Custom implementation to store mappings (PropertyName, FieldSource) in a Dictionary<string, string>
await contractResolver.PopulatePropertyMappings();
// Reading JSON and deserializing
using(TextReader tr = new StreamReader(jsonfile)){
string jsoncontent = await tr.ReadToEndAsync();
try{
var settings = new JsonSerializerSettings();
// Set the ContractResolver
settings.ContractResolver = contractResolver;
var item = JsonConvert.DeserializeObject<CustomClass>(jsoncontent, settings);
问题 -
Please have a look at my implementations of the protected function
ResolvePropertyName
in all these classes above and help me find the issue.
我 认为 我错误地覆盖了 - 并且 new
正在进一步覆盖的方法...
无法获取我(从文件)创建的自定义映射,因为调用了不正确的 ResolvePropertyName
...
执行DeserializeObject时,代码内部调用了
ResolvePropertyName
,但是当前的contractResolver
并没有调用重写的方法,它实际上调用了第一个碱基AbstractContractResolver.ResolvePropertyName
。 换句话说,我在所有4个函数(包括CustomClassImplementedContractResolver.ResolvePropertyName
)中都设置了断点,但它只执行了AbstractContractResolver
函数。奇怪的是:我使用 Visual Studio 代码并在
base.ResolvePropertyName
上按 F12 从每个继承函数到 base.
在AbstractContractResolverFromFile
变化
protected new virtual string ResolvePropertyName
至
protected override string ResolvePropertyName
新的东西隐藏了继承的实现,我通常建议避免它。这是需要注意的事情,因为您可能会在代码中遇到它。