反映Silverlight DataGrid中的内部属性

时间:2011-06-09 13:40:57

标签: c# silverlight reflection

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

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

但是我得到了以下异常

System.MethodAccessException未被用户代码处理   Message =尝试通过方法'DataGridDragAndDropSample.MainPage.Button_Click(System.Object,System.Windows.RoutedEventArgs)'来访问方法'System.Windows.Controls.DataGrid.get_DisplayData()'失败。   堆栈跟踪:        在System.RuntimeMethodHandle.PerformSecurityCheck(Object obj,RuntimeMethodHandleInternal方法,RuntimeType parent,UInt32 invocationFlags)        在System.RuntimeMethodHandle.PerformSecurityCheck(Object obj,IRuntimeMethodInfo方法,RuntimeType parent,UInt32 invocationFlags)        at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture,Boolean skipVisibilityChecks)        在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)        在System.Reflection.RuntimePropertyInfo.GetValue(Object obj,BindingFlags invokeAttr,Binder binder,Object [] index,CultureInfo culture)        在System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)        at DataGridDragAndDropSample.MainPage.Button_Click(Object sender,RoutedEventArgs e)        在System.Windows.Controls.Primitives.ButtonBase.OnClick()        在System.Windows.Controls.Button.OnClick()        在System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)        在System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl,EventArgs e)        在MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj,IntPtr unmanagedObjArgs,Int32 argsTypeIndex,Int32 actualArgsTypeIndex,String eventName)   InnerException:

在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

2 个答案:

答案 0 :(得分:1)

从我对Silverlight的了解和反思是 - 你不想做什么。请参阅此条目:Reflection restrictions in Silverlight

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

答案 1 :(得分:0)

当财产是内部的时候

必须启用用户代码

反射许可

银光所有限制都是

以防止滥用

不存在;可能的