Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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#中公开私有变量?_C#_Properties_Access Specifier - Fatal编程技术网

是否可以在c#中公开私有变量?

是否可以在c#中公开私有变量?,c#,properties,access-specifier,C#,Properties,Access Specifier,我只是想知道有没有可能在c#中公开一个私有变量?我知道如果一个类的数据是私有的,那么就不能从类外访问。如果,是的,那么怎么做?这是可能的。用于: Type type = yourObj.GetType(); BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo field = type.GetField("fieldName", flags); object value = field.Get

我只是想知道有没有可能在c#中公开一个私有变量?我知道如果一个类的数据是私有的,那么就不能从类外访问。如果,是的,那么怎么做?

这是可能的。用于:

Type type = yourObj.GetType();
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo field = type.GetField("fieldName", flags);
object value = field.GetValue(yourObj);
反射允许在运行时读取类型的元数据,并揭示类型内部(字段、属性等)

这是可能的。用于:

Type type = yourObj.GetType();
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo field = type.GetField("fieldName", flags);
object value = field.GetValue(yourObj);

反射允许在运行时读取类型的元数据,并揭示类型内部(字段、属性等)

非常感谢@Sergey Berezovskiy

在这里,我已经解决了这个问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ExposePrivateVariablesUsingReflection
{
    class Program
    {
        private class MyPrivateClass
        {
            private string MyPrivateFunc(string message)
            {
                return message + "Yes";
            }
        }

        static void Main(string[] args)
        {
            var mpc = new MyPrivateClass();
            Type type = mpc.GetType();

            var output = (string)type.InvokeMember("MyPrivateFunc",
                                        BindingFlags.Instance | BindingFlags.InvokeMethod |
                                        BindingFlags.NonPublic, null, mpc,
                                        new object[] {"Is Exposed private Member ? "});

            Console.WriteLine("Output : " + output);
            Console.ReadLine();
        }
    }
}

更多感谢@Sergey Berezovskiy

在这里,我已经解决了这个问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ExposePrivateVariablesUsingReflection
{
    class Program
    {
        private class MyPrivateClass
        {
            private string MyPrivateFunc(string message)
            {
                return message + "Yes";
            }
        }

        static void Main(string[] args)
        {
            var mpc = new MyPrivateClass();
            Type type = mpc.GetType();

            var output = (string)type.InvokeMember("MyPrivateFunc",
                                        BindingFlags.Instance | BindingFlags.InvokeMethod |
                                        BindingFlags.NonPublic, null, mpc,
                                        new object[] {"Is Exposed private Member ? "});

            Console.WriteLine("Output : " + output);
            Console.ReadLine();
        }
    }
}

您可以使用反射来访问私有变量。然而,尽管有点离题,我还是想分享一些关于InternalsVisibleTo的东西

假设您的域对象位于程序集MyExample.DomainObjects中,并且您不想将setter公开,但您需要您的服务层能够写入它们,但它位于单独的程序集中,您仍然可以使用内部setter并避免反射:

namespace MyExample.DomainObjects {
    public class MyObject{
        public string MyProp { get; internal set; }
    }
}
如果将以下内容放在MyExample.DomainObjects项目的AssemblyInfo.cs中,则可以将MyExample.ServiceLayer放在单独的程序集中

[assembly: InternalsVisibleTo("MyExample.ServiceLayer")]

然后,您可以从MyExample.ServiceLayer调用MyExample.DomainObjects中的内部设置程序。

您可以使用反射来访问私有变量。然而,尽管有点离题,我还是想分享一些关于InternalsVisibleTo的东西

假设您的域对象位于程序集MyExample.DomainObjects中,并且您不想将setter公开,但您需要您的服务层能够写入它们,但它位于单独的程序集中,您仍然可以使用内部setter并避免反射:

namespace MyExample.DomainObjects {
    public class MyObject{
        public string MyProp { get; internal set; }
    }
}
如果将以下内容放在MyExample.DomainObjects项目的AssemblyInfo.cs中,则可以将MyExample.ServiceLayer放在单独的程序集中

[assembly: InternalsVisibleTo("MyExample.ServiceLayer")]

然后你可以从MyExample.ServiceLayer中调用MyExample.DomainObjects中的内部设置程序。

hi,你能帮我一个小样本吗?@kumarch1当然,更新了答案,获取私有实例字段值的样本非常感谢。那么我们能说我的数据安全到什么程度。这是它暴露出来的照片。请告诉我,我如何才能使这个私人-我的意思是完全私人-这样没有其他人可以访问。可能吗?@kumarch1 Private不是指“安全”,它只是指“不向其他类公开”。您可以通过在源代码处保护数据而不是仅在私有字段中使用数据来确保数据的安全。@kumarch1不,您不能使数据“完全私有”—始终可以通过反射获取数据。但是你可以让这些信息很难使用。嗨,你能帮我拿一个小样本吗?@kumarch1当然,用获取私有实例值的样本更新了答案。非常感谢。那么我们能说我的数据安全到什么程度。这是它暴露出来的照片。请告诉我,我如何才能使这个私人-我的意思是完全私人-这样没有其他人可以访问。可能吗?@kumarch1 Private不是指“安全”,它只是指“不向其他类公开”。您可以通过在源代码处保护数据而不是仅在私有字段中使用数据来确保数据的安全。@kumarch1不,您不能使数据“完全私有”—始终可以通过反射获取数据。但是您可以使这些信息很难使用。是否修改类?如果可以修改该类,则可以通过属性或方法公开变量。是否修改该类?如果可以修改该类,则可以通过属性或方法公开变量。