将接口设置为属性c#



我已经创建了三个接口——IUser、ICostCenter和IDepartment。IUser和IDepartment是ICostCenter的属性。

public interface ICostCenter
{
IDepartment Department { get; set; }
User.IUser CostCenterHead { get; set; }
}

实现ICostCenter的类将在我的数据库的DbContext中使用。

public class tblCostCenter : WorkingInterface.Interface.Organization.ICostCenter
{
public tblCostCenter()
{
this.ID = Guid.NewGuid().ToString();
}
public string ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
private WorkingInterface.Interface.User.IUser CostCenterHead { get; set; }
public string UserID { get; set; }
[ForeignKey("UserID")]
public Model.tblUser UserObject
{
get { return (Model.tblUser)this.CostCenterHead; }
set { this.CostCenterHead = value; }
}
private WorkingInterface.Interface.Organization.IDepartment Department { get; set; }
public string DepartmenID { get; set; }
[ForeignKey("DepartmenID")]
public Model.tblDepartment DepartmentObject
{
get { return (Model.tblDepartment)this.Department; }
set { this.Department = (Model.tblDepartment)value; }
}
}

我收到一个错误,因为我将IUser和IDepartment属性设置为私有。如何正确实现接口?我希望这些属性被隐藏。

接口显式声明为public,这意味着该接口中声明的所有成员必须public

因此,您需要将这两个属性声明为公共属性:

public WorkingInterface.Interface.User.IUser CostCenterHead{get;set;}public WorkingInterface.Interface.Organization.IDepartment Department{get;set;}

注意:这些已被声明为隐式实现,因此它们可用于所有上下文。如果您想将它们隐藏起来,使其不被一般使用,可以使用显式实现。

因为您尝试使用private可访问性,我假设您通常想从视图中隐藏这些属性,您可以这样做,并且仍然可以通过使用显式实现语法来遵守接口约定:

WorkingInterface.Interface.User.IUser ICostCenter.CostCenterHead{get;set;}WorkingInterface.Interface.Organization.IDepartment ICostCenter.Department{get;set;}

它们仍然是public,但只能通过首先将对象显式地转换为特定的接口类型来访问

tblCostCenter obj = new tblCostCenter();
...
// this wont work:
Console.WriteLine(obj.CostCenterHead);
// instead you will have to cast the object first
Console.WriteLine((obj as ICostCenter)).CostCenterHead);
// or if the local variable was an ICostCenter
ICostCenter costObj = obj;
Console.WriteLine(costObj.CostCenterHead);
...
// Pattern matching can also be helpful in these scenarios
if (obj is ICostCenter cc)
Console.WriteLine(cc.CostCenterHead);

如果你想在你的类中使用显式声明,你可以试试这个:

WorkingInterface.Interface.User.IUser ICostCenter.CostCenterHead { get; set; }
public string UserID { get; set; }
[ForeignKey("UserID")]
public Model.tblUser UserObject
{
get { return ((ICostCenter)this).CostCenterHead as Model.tblUser; }
set { ((ICostCenter)this).CostCenterHead = value; }
}
WorkingInterface.Interface.Organization.IDepartment ICostCenter.Department { get; set; }
public string DepartmenID { get; set; }
[ForeignKey("DepartmenID")]
public Model.tblDepartment DepartmentObject
{
get { return ((ICostCenter)this).Department as Model.tblDepartment; }
set { ((ICostCenter)this).Department = value; }
}

这只适用于以下情况:

  • Model.tbl部门:I部门
  • Model.tblUser:User.IUser

最新更新