C# Silverlight数据网格中的反射内部属性
我正在尝试使用以下代码访问Silverlight DataGrid中的内部属性:C# Silverlight数据网格中的反射内部属性,c#,silverlight,reflection,C#,Silverlight,Reflection,我正在尝试使用以下代码访问Silverlight DataGrid中的内部属性: var displayDataType = dataGrid.GetType().GetProperty("DisplayData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var displayData = displayDataType.GetValue(data
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.按钮”尝试访问方法“System.Windows.Controls.DataGrid.get_DisplayData()”失败。
堆栈跟踪:
在System.RuntimeMethodHandle.PerformSecurityCheck(对象obj、RuntimeMethodHandleInternal方法、RuntimeType父级、UInt32调用标志)
在System.RuntimeMethodHandle.PerformSecurityCheck(对象obj、IRuntimeMethodInfo方法、RuntimeType父级、UInt32调用标志)
在System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、绑定器绑定器、对象[]参数、CultureInfo区域性、布尔skipVisibilityChecks)
在System.Reflection.RuntimeMethodInfo.Invoke(对象obj、BindingFlags invokeAttr、绑定器绑定器、对象[]参数、CultureInfo区域性)
位于System.Reflection.RuntimePropertyInfo.GetValue(对象obj、BindingFlags invokeAttr、Binder Binder、对象[]索引、CultureInfo区域性)
位于System.Reflection.RuntimePropertyInfo.GetValue(对象obj,对象[]索引)
在DataGridDragAndDropSample.MainPage.按钮上单击(对象发送器,路由EventTarget 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(控件ctrl,事件参数e)
在MS.Internal.JoltHelper.firevent处(IntPtr unmanagedObj、IntPtr unmanagedobjars、Int32 argsTypeIndex、Int32 actualgstypeindex、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和reflection的了解,您试图做的是不允许的。请参阅此条目:
我曾多次使用Reflector来检查DataGrid(以及CodePlex中的代码本身),以找到访问不容易暴露的部分的方法。。。在DataGrid(和相关类)上有这么多东西是内部的,这有点令人沮丧。我没有找到访问您感兴趣的DisplayData属性的方法。您可能需要查看代码,看看是否可以找到另一种方法来获得所需的内容。根据我对Silverlight和reflection的了解,您尝试执行的操作是不允许的。请参阅此条目:
我曾多次使用Reflector来检查DataGrid(以及CodePlex中的代码本身),以找到访问不容易暴露的部分的方法。。。在DataGrid(和相关类)上有这么多东西是内部的,这有点令人沮丧。我没有找到访问您感兴趣的DisplayData属性的方法。您可能需要查看代码,看看是否可以找到其他方法来获得所需的内容。@Jeff Machamer:添加了例外details@JeffMachamer:添加了异常详细信息