Re: GetGetMethod не найден...
От: OraStarter  
Дата: 25.06.09 07:00
Оценка:
На микрософте ответили(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=467764)
и предложили решение. Как Вам?
Re[2]: GetGetMethod не найден...
От: OraStarter  
Дата: 25.06.09 07:46
Оценка:
Попробовал компонентную модель:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace ConsoleApplication2
{
    public class MyClass1
    {
        private string _myProp;
        public string MyProp {
            set {
                _myProp = value;
            }
        }
    }

    public class MyClass2
    {
        private string _myProp;
        public string MyProp {
            get {
                return _myProp;
            }
            set {
                _myProp = value;
            }
        }
    }

    class Program
    {
        static void Main(string[] args) {
            MyClass1 myClass1 = new MyClass1();
            myClass1.MyProp = "test";
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(myClass1, false);
            PropertyDescriptor prop = props["MyProp"];
            if (prop == null) Console.WriteLine("class MyClass1 has not prop MyProp");
            else Console.WriteLine(prop.GetValue(myClass1));
            MyClass2 myClass2 = new MyClass2();
            myClass2.MyProp = "test";
            props = TypeDescriptor.GetProperties(myClass2, false);
            prop = props["MyProp"];
            if (prop == null)
                Console.WriteLine("class MyClass2 has not prop MyProp");
            else
                Console.WriteLine(prop.GetValue(myClass2));
        }
    }
}

TypeDescriptor.GetProperties — не видит write only св-в?
Re[2]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 25.06.09 09:31
Оценка:
Здравствуйте, OraStarter, Вы писали:

OS>На микрософте ответили(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=467764)

OS>и предложили решение. Как Вам?

А где там решение?
Вообще ответ в стиле:

The Caption property on the class Myproperty2 does not have a Get method.

Using reflection is not like using a general purpose object-oriented language, which has all kinds of rules for how to infer what you mean when you obviously don't mean what you say. When using reflection, you have to take the actual structure of the code into account.

Мне кажется лапшой. Причем полной Вообще-то мы "имеем" в виду структуру кода как бы и также имеем в виду, что по умолчанию рефлекшин должен извлекать информацию обо всех мемберах, включая тех которые унаследованы — причем так и происходит, за исключением конкретного случая. Я уже говорил — описанное поведение логично для DeclaredOnly, но без него — нелогично совсем.
Товарищи же пытаются объяснить проблему в стиле, что рефлекшин, видите ли, это такая особая штука, с такими особыми правилами, нужно брать в расчет "структуру кода" и бла-бла-бла. Ты их спроси лучше, почему когда речь идет о перегрузке методов нужно брать в расчет одну структуру кода, а при перегрузке свойств — какую-то, видимо, совсем другую?
Re[3]: GetGetMethod не найден...
От: OraStarter  
Дата: 25.06.09 11:24
Оценка: 7 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, OraStarter, Вы писали:


OS>>На микрософте ответили(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=467764)

OS>>и предложили решение. Как Вам?

ВВ>А где там решение?

Entered by AnDai[MS] on 6/24/2009
using System;
using System.Reflection;

public class Myproperty1
{
    private string caption = "A Default caption 1";
    public virtual string Caption
    {
        get
        {
            return caption;
        }
        set
        {
            if (caption != value)
            {
                caption = value;
            }
        }
    }
}

public class Myproperty2 : Myproperty1
{
    private string caption2 = "A Default caption 2";
    public override string Caption
    {
        set
        {
            if (caption2 != value)
            {
                caption2 = value;
            }
        }
    }
}

namespace ConsoleApplication7
{
    class Program
    {
        public static int Main()
        {
            Myproperty2 myproperty2 = new Myproperty2();

            Type t = myproperty2.GetType();
            
            do {
                PropertyInfo propertyInfo = t.GetProperty("Caption");
                if (propertyInfo == null)
                    break;

                MethodInfo methodInfo = propertyInfo.GetGetMethod();
                if (methodInfo != null)
                {
                    Console.WriteLine("getter is: {0}", methodInfo);

                    object value = propertyInfo.GetValue(myproperty2, null);
                    Console.WriteLine(value);

                    break;
                }

                t = t.BaseType;
            } while (t != null);

            return 0;
        }
    }
}


ВВ>Вообще ответ в стиле:


ВВ>The Caption property on the class Myproperty2 does not have a Get method.


ВВ>Using reflection is not like using a general purpose object-oriented language, which has all kinds of rules for how to infer what you mean when you obviously don't mean what you say. When using reflection, you have to take the actual structure of the code into account.


ВВ>Мне кажется лапшой. Причем полной Вообще-то мы "имеем" в виду структуру кода как бы и также имеем в виду, что по умолчанию рефлекшин должен извлекать информацию обо всех мемберах, включая тех которые унаследованы — причем так и происходит, за исключением конкретного случая. Я уже говорил — описанное поведение логично для DeclaredOnly, но без него — нелогично совсем.

ВВ>Товарищи же пытаются объяснить проблему в стиле, что рефлекшин, видите ли, это такая особая штука, с такими особыми правилами, нужно брать в расчет "структуру кода" и бла-бла-бла. Ты их спроси лучше, почему когда речь идет о перегрузке методов нужно брать в расчет одну структуру кода, а при перегрузке свойств — какую-то, видимо, совсем другую?

OK попробую
Re[4]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 25.06.09 12:05
Оценка:
Здравствуйте, OraStarter, Вы писали:

OS>>>На микрософте ответили(https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=467764)

OS>>>и предложили решение. Как Вам?
ВВ>>А где там решение?
OS>Entered by AnDai[MS] on 6/24/2009

Понятно. Но вообще в таком виде пример некорректен. Нет никакой гарантии, что мы достанем то же самое, свойство выполнив GetProperty("Caption") — hidebyname еще никто не отменял
Полноценное решение с использованием данного подхода должно все это учитывать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.