Внутреннее свойство отражения в Silverlight DataGrid - PullRequest
1 голос
/ 09 июня 2011

Я пытаюсь получить доступ к внутреннему свойству в 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 = Attemptс помощью метода «DataGridDragAndDropSample.MainPage.Button_Click (System.Object, System.Windows.RoutedEventArgs)» получить доступ к методу «System.Windows.Controls.DataGrid.get_DisplayData ()» не удалось.StackTrace: в System.RuntimeMethodHandle.PerformSecurityCheck (объектный объект, метод RuntimeMethodHandleInternal, родительский объект RuntimeType, invocationFlags UInt32) в системном объекте.obj, BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo, логическое skipVisibilityChecks) в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, параметры BindingFlags invokeAttr, связыватель Binder, Object [], культура CultureInfo) в System.Ref.RuntimePropertyInfo.GetValue (Object obj, BindingFlags invokeAttr, Binder binder, Object [] index, CultureInfo culture) в System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index) в DataGridDragAndDropSample.MainPageEventDervent_vent_Gender) в 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, EventArgs e) в MS.Internal.JoltEntjbT, 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();
        }
    }  
}

Есть предложения?

С уважением, Картик

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Из того, что я узнал о Silverlight и рефлексии, - то, что вы пытаетесь сделать, запрещено.См. Эту запись: Ограничения отражения в Silverlight

Я много использовал Reflector для проверки DataGrid (а также самого кода из CodePlex), чтобы найти способы доступа к частям, которыене так легко разобраться ... разочаровывает, что в DataGrid (и связанных с ним классах) столько всего внутреннего.Я не нашел способа получить доступ к интересующему вас свойству DisplayData. Возможно, вы захотите просмотреть код и посмотреть, сможете ли вы найти другой способ получить то, что вы хотите.

0 голосов
/ 09 июня 2011

когда свойство является внутренним

код пользователя должен быть включен, чтобы иметь

разрешение на отражение

с серебряным светом все ограничения:

на месте, чтобы предотвратить злоупотребления

нет; возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...