Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Каждому свое
531 / 217 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
1

Поменять значение свойства через указатель

25.09.2017, 20:49. Показов 696. Ответов 10
Метки нет (Все метки)

Возвращаюсь снова к тому же вопросу. Есть два класса:
C#
1
2
3
4
5
6
7
8
class Source
{
public int Value1 { get; set; } = 10;
}
class Destination
{
public int Value1 { get; set; } = 20;
}
В main получаю значение Value1 у каждого типа, через рефлексию. Почему через рефлексию, просто так надо, не хочу всю суть задачи приводить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
{
Source s = new Source();
Destination d = new Destination();
 
Type typeSrc = s.GetType();
Type typeDest = d.GetType();
 
PropertyInfo propertyValue1Src = typeSrc.GetProperty( "Value1" );
PropertyInfo propertyValue1Dest = typeDest.GetProperty( "Value1" );
 
object value1Dest = propertyValue1Dest.GetValue( d ); // Вот тут value1Dest должна быть по тому же адресу, что и d.Value1
object value1Src = propertyValue1Src.GetValue( s );
value1Dest = value1Src; // Соответственно должно измениться значение d.Value1
}
Так работать не будет, так как propertyValue1Dest.GetValue( d ) возвращает копию свойства d.Value1, так как Value1 является ValueType.

Но как тогда можно реализовать, то что мне нужно? Не подскажете?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2017, 20:49
Ответы с готовыми решениями:

Значение ячейки памяти через указатель
Хочу узнать значения ячеек памяти на определенном участке. Для этого пробую задать указателю адрес...

Передать значение из одного класса в другой через указатель
Я не могу додуматься что тут не так class Car { private: int weight; public: Car(int w)...

Почему не возвращается значение через указатель из метода класса?
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода...

Как передать возвращаемое значение в функции getY через указатель
Добрый вечер. Подскажите, как передать возвращаемое значение в функции getY через указатель...

10
Эксперт .NET
5374 / 4160 / 1193
Регистрация: 12.10.2013
Сообщений: 12,073
Записей в блоге: 2
25.09.2017, 21:03 2
Цитата Сообщение от Bretbas Посмотреть сообщение
как тогда можно реализовать, то что мне нужно?
Bretbas, вам типа того нужно?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
 
namespace ConsoleApplication3 {
    class Program {
        static void Main(string[] args) {
            Source source = new Source();
            Destination destination = new Destination();
            Console.WriteLine("Before");
            Console.WriteLine("SourceValue: {0}",source.SourceValue);
            Console.WriteLine("DestinationValue: {0}",destination.DestinationValue);
 
            PropertyInfo sourceProp = source.GetType().GetProperty("SourceValue");
            PropertyInfo destinationProp = destination.GetType().GetProperty("DestinationValue");
 
            int sourceValue = int.Parse(sourceProp.GetValue(source, null).ToString());
            int destinationValue = int.Parse(destinationProp.GetValue(destination, null).ToString());
 
            sourceProp.SetValue(source, destinationValue, null);
            destinationProp.SetValue(destination, sourceValue, null);
 
            Console.WriteLine("After");
            Console.WriteLine("SourceValue: {0}",source.SourceValue);
            Console.WriteLine("DestinationValue: {0}",destination.DestinationValue);
            Console.ReadLine();
        }
    }
    class Source {
        public int SourceValue { get; set; }
        public Source() {
            SourceValue = 10;
        }
    }
    class Destination {
        public int DestinationValue { get; set; }
        public Destination() {
            DestinationValue = 20;
        }
    }
}
1
Каждому свое
531 / 217 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.09.2017, 21:18  [ТС] 3
insite2012, не совсем. Про метод SetValue у PropertyInfo я знаю. Но дело в том, что в моем задачи такой подход выходит только в том случае, если код превратить в кашу. Я хотел бы этого избежать. Чтобы это сделать, я написал метод, который принимает объект типа T, и его PropertyInfo. Причем PropertyInfo может не только являться отражением свойства верхнего уровня. И мой метод рекурсивно проходит по всем свойствам, получает значения для каждого промежуточного PropertyInfo и в конце рекурсии возвращает объект, который является значением свойства, которое отражает первый PropertyInfo, который я передал как параметр в этот метод.
Наверное Вы ничего не поняли Вообщем такой подход не пойдет. Мне именно нужен указатель на объект, который возвращает метод GetValue класса PropertyInfo. Это было бы здорово для меня

Добавлено через 2 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
property.rolePredicate = ( TSource source ) =>
{
    Stack<PropertyInfo> propertyStack = new Stack<PropertyInfo>();
    propertyStack.Push( propertyCompose.propertyInfo );
 
    var parent = propertyCompose.ParentProperty;
    while( parent != null )
    {
        propertyStack.Push( parent.propertyInfo );
        parent = parent.ParentProperty;
    }
                    
    object nodeValue = propertyStack.Pop().GetValue( source );
    foreach( var p in propertyStack )
        nodeValue = p.GetValue( nodeValue );
 
    return propertyInfo.GetValue( nodeValue );
};
предполагается, что структура со всеми свойствами(внешними, внутренними) заранее подготовлена.
0
Эксперт .NET
5374 / 4160 / 1193
Регистрация: 12.10.2013
Сообщений: 12,073
Записей в блоге: 2
25.09.2017, 21:23 4
Цитата Сообщение от Bretbas Посмотреть сообщение
Наверное Вы ничего не поняли
Как вы задали вопрос-так я и ответил. Я не слежу за вашими темами и понятия не имею, где и что вы пытались реализовать и каким способом.
0
Каждому свое
531 / 217 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.09.2017, 21:33  [ТС] 5
insite2012, вообщем, я ща еще немного подумаю, если не получится, постараюсь по подробнее объяснить что я хочу
0
Эксперт .NET
5374 / 4160 / 1193
Регистрация: 12.10.2013
Сообщений: 12,073
Записей в блоге: 2
25.09.2017, 21:49 6
Цитата Сообщение от Bretbas Посмотреть сообщение
постараюсь по подробнее объяснить что я хочу
Это было бы лучшим вариантом)))
0
Эксперт .NET
5550 / 3603 / 1492
Регистрация: 09.05.2015
Сообщений: 8,660
25.09.2017, 23:25 7
Свойства это методы, а методы не имеют значений. Так что не возможно сделать то что вы хотите со свойствами. С полями возможно получится...
1
Эксперт .NET
9427 / 6795 / 1092
Регистрация: 21.01.2016
Сообщений: 25,770
26.09.2017, 03:33 8
Bretbas, свойства - методы, взять «указатель» на его значение (которого может и не быть) нельзя. И оно понятно почему. Используйте метод SetValue(). Никакой «каши» он в код не привносит, как и его комплиментарный коллега GetValue().
1
Каждому свое
531 / 217 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.09.2017, 21:19  [ТС] 9
Usaga, Someone007, insite2012, Уже разобрался, как можно обойтись без указателей. Спасибо за ответы
0
1435 / 839 / 313
Регистрация: 17.05.2015
Сообщений: 3,222
26.09.2017, 22:05 10
Bretbas, Так как? Мне, например, тоже интересно
0
управление сложностью
1685 / 1297 / 260
Регистрация: 22.03.2015
Сообщений: 7,548
Записей в блоге: 5
27.09.2017, 15:16 11
Цитата Сообщение от Рядовой Посмотреть сообщение
Так как? Мне, например, тоже интересно
Скорее всего была магия какого-нибудь паттерна
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2017, 15:16

Передать значение переменной в параметры другой функции через указатель
Доброго времени суток. Уже учу ООП и каждый раз возвращаюсь к одной и той же проблеме, которую...

Как вывести на экран переменную из функции, которой присваиваеться значение через указатель?
Только начал изучать С++. И не могу понять, как вывести на экран переменную pdLocalVar из функции...

Поменять значение value через jQ
Нужен скрипт, который меняет значение value на любое другое. &lt;script&gt; $(&quot;#push&quot;).click(function...

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru