0

我正在尝试在结构继承中使用泛型,请参阅。

  public class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
    {

        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}

 public abstract class ObjectBase<T> 
{
}

它不会让我对我的结构使用私有,因为它会引发错误:不一致的可访问性:基类“ObjectBaseAuditLogEntry.AuditLogEntryStruct>”比类“AuditLogEntry”更难访问。

但是我真的不想公开我的结构。有任何想法吗?谢谢,亚历克斯

关注问题:

这是我们正在尝试做的事情:

class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
{
  internal struct AuditLogEntryStruct
        {
            public int AuditID;
}

  public int AuditID
        {
            get
            {
                return udtObject.AuditID;
            }
set{
BeginEdit();
 udtObject.AuditID = value;
        }

}

 class ObjectBase<T>
{
  protected T udtObject;
        protected T udtPreEditObject;

  protected  void BeginEdit()
        {
            if (!IsDirty)
            {
                IsDirty = true;
                udtPreEditObject = udtObject;
            }
        }
}

我不确定如何在公开 AuditLogEntryStruct 中实现这一目标?谢谢,亚历克斯

4

2 回答 2

2

当一个或多个类型参数不是公共的时,您不能从泛型类派生公共类

任何类型派生自的类型必须与派生类一样可访问,包括作为类型参数提供给基类​​的任何类型参数

如果你有

public class publicClass{}

任何类都可以从 A 派生,但是如果您将其更改为

internal class internalClass{}

只有其他内部类可以从中派生。

如果您将其中任何一种类型作为类型参数传递,情况也是如此。以下前三项有效,第四项无效

public class A : List<publicClass>{}
internal class B : List<internalClass>{}
internal class C : List<publicClass>{}

//not valid because D has wider accessibility than the close generic type List<internalClass>
public class D : List<internalClass>{}

编辑 语言团队在某些时候不得不做出决定,是声明您的无效,还是使用您的类型导致非法访问不可访问的类型无效。在您的情况下,将有几个方法返回一个类型,除了您的类之外,所有其他人都无法访问该类型,并且许多方法采用其他类无法提供的类型的参数。因此,真正能够使用您的类的对象的唯一对象将是您的类的对象。你可以用组合而不是继承来解决这个问题

public class AuditLogEntry
{
        private ObjectBase<AuditLogEntry.AuditLogEntryStruct> _entry;
        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}

public abstract class ObjectBase<T> 
{
}
于 2012-04-19T12:54:36.960 回答
0

考虑这个例子:

public class Foo : List<Bar>
{
    private struct Bar { }
}


var myFoo = new Foo();
...
var x = myFoo()[0]; // expression on the right side is of type Bar, yet Bar is inaccessible

更新

您要实现的目标实际上并不需要泛型。您只能ObjectBase<T>像访问对象一样访问内部的结构。您不妨将它们更改为object并完全删除泛型类型。

如果你有更多的逻辑需要某种功能AuditLogEntryStruct才能在 中访问ObjectBase<T>,你可以提取一个接口:

public interface IStructsWithSomeFunctionality { ...  }

使您的结构实现它并将其用作您的类型参数

public class AuditLogEntry : ObjectBase<IStructsWithSomeFunctionality> { ... }
于 2012-04-19T13:01:22.497 回答