Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法绕过private关键字?_C#_.net - Fatal编程技术网

C# 有没有办法绕过private关键字?

C# 有没有办法绕过private关键字?,c#,.net,C#,.net,我有一堆用于调试目的的代码。因此,我在其周围提出: #if DEBUG #endif 问题在于,此调试代码需要将私有变量从其他类输出到文件中。我可以将调试代码潜入每个类中,但这会使现有代码更加混乱,因为我将调试代码与实际代码混合在一起。我可以将所有调试代码放入另一个类中,但这意味着我必须将类中的私有变量公开 为了调试代码,有没有办法忽略private关键字?我可以使用公共getter,但这违背了不让真正的代码更加混乱的目的 有没有可能让它们成为内部的而不是私人的 使用关键字: 动态foo=您的

我有一堆用于调试目的的代码。因此,我在其周围提出:

#if DEBUG
#endif
问题在于,此调试代码需要将私有变量从其他类输出到文件中。我可以将调试代码潜入每个类中,但这会使现有代码更加混乱,因为我将调试代码与实际代码混合在一起。我可以将所有调试代码放入另一个类中,但这意味着我必须将类中的私有变量公开

为了调试代码,有没有办法忽略private关键字?我可以使用公共getter,但这违背了不让真正的代码更加混乱的目的

  • 有没有可能让它们成为内部的而不是私人的
  • 使用关键字:

    动态foo=您的objectwithprivatefields; int privateValue=(int)foo.yourprovatefield

  • 使用反射:
    typeof(YourObject).GetField(fieldName,bindFlags).GetValue(yourObjectWithPrivateFields)


  • 如影片所示,使用反射可能是解决这个特定问题的最佳方法

    为了说明OP询问的解决代码组织问题的一种方法,我提供了另一种方法的示例。这可能不是解决希望从私有成员记录数据以进行调试问题的理想方法,但它演示了如何使用分部类以及嵌套类来组织代码,以便为外部代码提供访问私有成员的方法

        // This MyClass code goes into a MyClass.cs file
        public partial class MyClass
        {
            private int fieldA;
    
            private string fieldB;
    
            private decimal fieldC;
    
            public MyClass(int a, string b, decimal c)
            {
                this.fieldA = a;
                this.fieldB = b;
                this.fieldC = c;
            }
        }
    
        // This additional code for MyClass goes into a
        // separate MyClass.debug.cs file
    #if DEBUG
    
        partial class MyClass : IDebugAccessible
        {
            public IDebugAccessor GetDebugAccessor()
            {
                return new DebugAccessor(this);
            }
    
            // The MyClass.DebugAccessor nested class has access to
            // private members of MyClass.
            private class DebugAccessor : IDebugAccessor
            {
                private MyClass instance;
    
                public DebugAccessor(MyClass instance)
                {
                    this.instance = instance;
                }
    
                public IEnumerable<KeyValuePair<string, object>> Values
                {
                    get
                    {
                        return new Dictionary<string, object>
                        {
                            { "fieldA", instance.fieldA },
                            { "fieldB", instance.fieldB },
                            { "fieldC", instance.fieldC },
                        };
                    }
                }
            }
        }
    
    #endif
    
        // The intention behind creating these interfaces is to define
        // a standard way to access values from different types
        // for debugging purposes.  This is just a simple example.
        // These interfaces would go into their own .cs file.
        public interface IDebugAccessor
        {
            IEnumerable<KeyValuePair<string, object>> Values { get; }
        }
    
        public interface IDebugAccessible
        {
            IDebugAccessor GetDebugAccessor();
        }
    
    //此MyClass代码进入MyClass.cs文件
    公共部分类MyClass
    {
    私人int fieldA;
    私有字符串字段b;
    私有十进制字段c;
    公共MyClass(整数a、字符串b、十进制c)
    {
    这个字段a=a;
    这个.fieldB=b;
    这个.fieldC=c;
    }
    }
    //MyClass的这段附加代码进入了
    //单独的MyClass.debug.cs文件
    #如果调试
    分部类MyClass:IDebugAccessible
    {
    公共IDebugAccessor GetDebugAccessor()
    {
    返回新的DebugAccessor(此);
    }
    //MyClass.DebugAccessor嵌套类可以访问
    //MyClass的私人成员。
    私有类DebugAccessor:IDebugAccessor
    {
    私有MyClass实例;
    公共调试访问器(MyClass实例)
    {
    this.instance=instance;
    }
    公共IEnumerable值
    {
    得到
    {
    返回新词典
    {
    {“fieldA”,instance.fieldA},
    {“fieldB”,instance.fieldB},
    {“fieldC”,instance.fieldC},
    };
    }
    }
    }
    }
    #恩迪夫
    //创建这些接口的目的是定义
    //访问不同类型值的标准方法
    //用于调试目的。这只是一个简单的例子。
    //这些接口将进入它们自己的.cs文件。
    公共接口访问器
    {
    IEnumerable值{get;}
    }
    可访问的公共接口
    {
    IDebugAccessor GetDebugAccessor();
    }
    
    是否可以将私有变量改为内部变量?是否有单元测试?将调试代码放在那里?“此调试代码需要将私有变量从其他类输出到文件”-您不能只在该类中添加条件日志记录,这样每个类都会打印自己感兴趣的变量,但仅当日志记录设置为“调试”时才会打印?您可以使用反射来获取私有字段:。您必须在返回的
    FieldInfo
    类上使用
    GetValue
    方法来获取实际值。是的,但是封装、隐藏实现或控制它的目的是什么?您不能通过
    dynamic
    类型的变量访问私有成员。除了为它公开一些非私有成员之外,唯一的方法是使用反射,并拥有正确的访问权限。完全忘记了部分类,这是一个完美的解决方案!