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...

AbstractContractResolverFromFile变化

protected new virtual string ResolvePropertyName

protected override string ResolvePropertyName

新的东西隐藏了继承的实现,我通常建议避免它。这是需要注意的事情,因为您可能会在代码中遇到它。