我正在尝试使用以下代码访问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
答案 0 :(得分:1)
从我对Silverlight的了解和反思是 - 你不想做什么。请参阅此条目:Reflection restrictions in Silverlight
我已经使用Reflector来检查DataGrid(以及来自CodePlex的代码本身),以找到访问不容易暴露的部分的方法......有点令人沮丧的是,很多东西都是内部的DataGrid(和相关类)。我还没有找到一种方法来访问您感兴趣的DisplayData属性。您可能希望查看代码,看看是否可以找到另一种方法来获得您想要的内容。
答案 1 :(得分:0)
当财产是内部的时候
必须启用用户代码
反射许可
银光所有限制都是
以防止滥用
不存在;可能的