Silverlight DataGrid中的反射内部属性

本文关键字:内部 属性 反射 DataGrid Silverlight | 更新日期: 2023-09-27 17:58:57

我正在尝试使用以下代码访问Silverlight DataGrid中的内部属性:

 var displayDataType = dataGrid.GetType().GetProperty("DisplayData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        var displayData = displayDataType.GetValue(dataGrid, null);

但我得到以下异常

系统。用户代码未处理MethodAccessExceptionMessage=方法"DataGridDragAndDropSample"的尝试。主页。Button_Click(System.Object,System.Windows.RoutedEventArgs)"访问方法"System。Windows。控件。DataGrid.get_DisplayData()'失败。StackTrace:在系统中。RuntimeMethodHandle。PerformSecurityCheck(对象obj、RuntimeMethodHandleInternal方法、RuntimeType父级、UInt32 invocationFlags)在系统中。RuntimeMethodHandle。PerformSecurityCheck(Object obj、IRuntimeMethodInfo方法、RuntimeType父级、UInt32 invocationFlags)在系统中。反射运行时方法信息。Invoke(Object obj、BindingFlags invokeAttr、Binder Binder、Object[]参数、CultureInfo区域性、Boolean skipVisibilityChecks)在系统中。反射运行时方法信息。Invoke(Object obj、BindingFlags invokeAttr、Binder Binder、Object[]参数、CultureInfo区域性)在系统中。反射RuntimePropertyInfo。GetValue(Object obj、BindingFlags invokeAttr、Binder绑定器、Object[]索引、CultureInfo区域性)在系统中。反射RuntimePropertyInfo。GetValue(Object obj,Object[]索引)位于DataGridDragAndDropSample。主页。Button_Click(对象发送器,RoutedEventArgs e)在系统中。Windows。控件。基本体。ButtonBase。单击()在系统中。Windows。控件。按钮单击()在系统中。Windows。控件。基本体。ButtonBase。OnMouseLeftButtonUp(鼠标按钮事件参数e)在系统中。Windows。控件。控制OnMouseLeftButtonUp(控制ctrl,事件参数e)位于MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj、IntPtr unmanagedObjArgs、Int32 argsTypeIndex、Int32 actualArgsTypeIndex和String eventName)内部异常:

是否有其他方法可以在Silverlight DataGrid中访问此属性?

我用简单的示例检查了代码,它似乎可以工作。样本代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLib
{
    public class Data
    {
        public Data()
        {
            this.Num = new Num() { Name = "ctor" };
        }
        internal Num Num
        {
            get;
            private set;
        }
    }
    internal class Num
    {
        private string name = string.Empty;
        public string Name
        {
            get
            {
                return this.name;
            }
            internal set
            {
                this.name = value;
            }
        }
    }
}
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Data d = new Data();
            var displayDataType = d.GetType().GetProperty("Num", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            var displayData = displayDataType.GetValue(d, null);

            Console.ReadKey();
        }
    }  
}

有什么建议吗?

谨致问候,Karthik

Silverlight DataGrid中的反射内部属性

根据我对Silverlight和反射的了解,您试图做的是不允许的。请参阅以下条目:Silverlight 中的反射限制

我经常使用Reflector来检查DataGrid(以及CodePlex的代码本身),以找到访问不容易暴露的部分的方法。。。有点令人沮丧的是,DataGrid(和相关类)上有这么多东西是内部的。我还没有找到访问您感兴趣的DisplayData属性的方法。您可能想查看代码,看看是否可以找到其他方法来获得您想要的内容。

当属性为内部时

必须启用用户代码才能具有

反射许可

有了银光,所有的限制都是

防止滥用

不在场;可能的