2

如何定义一个结构,其成员可以被任何内部类通过属性访问,但只能由特定的内部类设置?(如果有可能。)

如果不可能,是否有实现类似要求的工作?

编辑1:下面

原因:

我有一个有两个成员 _x 和 _arrB 的 A 类。_x 可以通过 x 被内部类(A 类除外)读取但不能修改。

我还希望允许内部类读取 _arrB 中的 structB 元素并读取这些 structB 的成员。但我只希望 A 类能够修改 _arrB 中的 structB 元素或那些 structB 的成员。因此,我认为我需要一个可以指定哪些内部类可以修改其成员的结构。 [1]

class A 
{
    private int _x;
    internal int x
    {
        private set
        {
            _x = value / 2;
        }
        internal get
        {
            return _x * 2;
        }
    }

    private B[] _arrB;
    internal B[] arrB
    { 
        private set
        {
            _arrB = value;
        }
        internal get
        {
            return _arrB;
        }
    }

    public A() 
    {
        _x = //value read from somewhere;            

        //do something to determine size
        _arrB = new B[size];
        //populate _arrB
        ...
    }


}

注意:内部类是指同一程序集中的类,而不是嵌套类。

[1] 但是,_arrB 是一个数组,它是一个对象,它是一个引用类型。当内部类获得 _arrB 的引用时,structB 的元素可能会在不受控制的情况下被修改。我意识到我不希望内部类将 _arr[0] 设置为空。所以任何解决方案都必须考虑到这一点。

我会在剩下的时间里考虑它,并在我想到一个解决方案时发布一个解决方案。

4

3 回答 3

1

我唯一能想到的是使用堆栈跟踪来获取调用帧,然后是调用方法,然后是该方法的反射类型。然后,您可以检查该类型是您所期望的。

编辑,警告,错误代码:

StackTrace oStack = new StackTrace(true);

string callingType = oStack.GetFrame(1).GetMethod().ReflectedType.FullName;

if(callingType != "MyAcceptableClass")
    throw new MethodAccessException(
          callingType + " is not allowed to call this method");

我个人会重新考虑您的设计,也许这些类不应该在同一个程序集中?然后,您可以使两个程序集成为朋友程序集,以便它们可以访问彼此的内部成员。

于 2010-07-22T08:10:53.217 回答
1

我想知道你为什么要这样做。只有丑陋的黑客是可能的AFAIK。

开始警告:如果您不喜欢丑陋的代码,请不要阅读!!!

大卫尼尔所说的。

您可以将它们放在单独的程序集中并将它们设置为友好:

[assembly:InternalsVisibleToAttribute("assembly name", "key")]

你可以像这样设计这个类:

internal struct ModifiedStruct
{
    public int Value {get; private set; }

    internal class ModifyingClass
    {
        public void ModifyValue()
        {
            ModifiedStruct s = new ModifiedStruct();
            s.Value = 456;
        }
    }

}

结束警告

编辑(问题已更改)要禁止修改集合,请使用ReadOnlyCollection 类

internal ReadOnlyCollection<B> BCollection
{
    get
    {
        return new ReadOnlyCollection<B>(_arrB);
    }
}
于 2010-07-22T08:21:14.483 回答
0

如果可以在其字段中创建具有特定值的结构,则该结构类型的任何可变存储位置都可以通过创建具有这些值的实例然后将该实例复制到相关存储位置来进行变异以保存这些值。Sayingstruct1=struct2等价于struct1.field1 = struct2.field1; struct1.field2 = struct2.field2;对 struct 类型的所有字段,public 和 private 说等。

于 2012-02-23T01:32:50.927 回答