【问题标题】:Interface Mismatch Property Accessor接口不匹配属性访问器
【发布时间】:2018-01-07 22:57:55
【问题描述】:

我有一个简单的接口,我想用不同的访问器来实现

public interface IValidatorByState : IValidator
{
    AuthorizedDbContext Context { get; set; }
}

我正在尝试在具有公共或受保护获取和内部集的类上实现这一点;

Edit这个类是暴露给用户的,他们应该只能检索上下文。

public class ValidatorByState<TEntity> : AbstractValidator<TEntity>, IValidatorByState
{
    public AuthorizedDbContext Context { get; internal set;}
}

不管用哪种方式实现都报错

尝试:

public AuthorizedDbContext Context { get; internal set;}

ValidatorByState.Context 不公开

protected AuthorizedDbContext Context { get; internal set;}

ValidatorByState.Context.set 访问器必须比属性更严格,

AuthorizedDbContext _context;
public AuthorizedDbContext IValidatorByState.Context => this._context;
public AuthorizedDbContext IValidatorByState.Context {
    set { this._context = value; }
}

为此,我在两个陈述中都遇到了错误

显式实现缺少访问器

我怎样才能有一个带有内部集的公共 get 方法?

【问题讨论】:

    标签: c# syntax accessor


    【解决方案1】:

    我将创建一个带有 setter 方法/属性的只读和内部接口的公共接口。内部接口必须显式实现:

    public interface IValidatorByStateReadOnly 
    {
        AuthorizedDbContext Context { get; }
    }  
    
    internal interface IValidatorByState : IValidatorByStateReadOnly
    {
        new AuthorizedDbContext Context { get; set; }
    }
    
    public class ValidatorByState<TEntity> : IValidatorByState
    {
        private AuthorizedDbContext _context;
    
        public AuthorizedDbContext Context => _context;
    
        AuthorizedDbContext IValidatorByState.Context 
        {
            get => _context;
            set => _context = value; 
        }
    }
    

    【讨论】:

    • 哦,这更好。现在让我检查一下,我认为这是完美的
    【解决方案2】:

    接口成员必须是公开的。

    关于:

    public interface IValidatorByStateReader
    {
        AuthorizedDbContext Context { get; }
    }
    
    internal interface IValidatorByStateWriter
    {
        AuthorizedDbContext Context { set; }
    }
    
    public class ValidatorByState<TEntity> : IValidatorByStateReader, IValidatorByStateWriter
    {
        private AuthorizedDbContext _context;
        AuthorizedDbContext IValidatorByStateReader.Context => this._context;
        AuthorizedDbContext IValidatorByStateWriter.Context { set => this._context = value; }
    } 
    

    【讨论】:

    • 这可能行得通,但现在当我有一个地图 ValidatorByStates 时,如果不强制转换为两个接口,我将无法设置它们的上下文。
    • 接口成员不必公开。它们必须是公开的才能使用隐式实现。显式实现只能通过对接口的引用来调用。
    • 这个答案不起作用,这会将上下文属性仍然暴露给用户。
    • @SantiagoRegojo ValidatorByState 是一个由我正在编写框架的用户实现的类
    • 他们仍然可以设置公共上下文,只是无法访问界面
    猜你喜欢
    • 2014-09-18
    • 2013-03-22
    • 2012-03-11
    • 2018-09-10
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多