代码之家  ›  专栏  ›  技术社区  ›  blizpasta

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

  •  2
  • blizpasta  · 技术社区  · 15 年前

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

    编辑1:下面

    我有一个a级,有两个成员x和arrB_x可以被读取,但不能被内部类(除了类A)修改到x。

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

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

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Jaroslav Jandek    15 年前

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

    什么 专家大卫·尼欧 说。

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

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

    internal ReadOnlyCollection<B> BCollection
    {
        get
        {
            return new ReadOnlyCollection<B>(_arrB);
        }
    }
    
        2
  •  1
  •   David Neale    15 年前

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

    编辑,警告,错误代码:

    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");
    

        3
  •  0
  •   supercat    14 年前

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