Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 18:32   #1
userVaz
Новичок
Джуниор
 
Регистрация: 04.05.2012
Сообщений: 5
По умолчанию Список обьектов имеющих одинаковое поле но разного типа

Добрый день.
есть примерно 10 компонент. Разного типа.
Не все ( а точнее почти никто ) не являеться потомком от Control
но все имеют свои поля Visible , Enable...
компоненты сторонние. из пакета ( Add-In-Express)...
видимо писаны своими методами...
например среди элементов присутсвутю классы
  • ADXRibbonGroup
  • ADXRibbonButton
  • ADXRibbonContextMenu
  • ADXCommandBarButton
и т.д..
общего предка нет.

интересует запись как можно сделать функцию , в которую пердается параметры
Код:
void foo(bool bVisib , _ObjectTypeX_  x)
{
x.visible = bVisib ;
x.enabled = bVisib ;
}
я пробовал использовать dynamic в качестве _ObjectTypeX_
безуспешно.

У кого нибудь есть другие варианты ? (желательно C# 4.0 ).
userVaz вне форума Ответить с цитированием
Старый 04.05.2012, 18:40   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

а так не покатит?
Код:
private void foo(bool bVisib ,object t)
        {
            var i = t.GetType().GetProperty("Visible");
            i.SetValue(t, bVisib , null);
        }
Reskov вне форума Ответить с цитированием
Старый 04.05.2012, 18:44   #3
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
я пробовал использовать dynamic в качестве _ObjectTypeX_
безуспешно.
Почему ?

А или потому что
Цитата:
все имеют свои поля Visible , Enable...
а вы указываете
Цитата:
x.visible = bVisib ;
x.enabled = bVisib ;

Последний раз редактировалось Stilet; 04.05.2012 в 19:07.
=master= вне форума Ответить с цитированием
Старый 04.05.2012, 19:29   #4
userVaz
Новичок
Джуниор
 
Регистрация: 04.05.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Почему ?
А или потому что
а вы указываете
На попытку использовать dynamic в качестве типа компилятор ругаеться
Error 1 Predefined type 'Microsoft.CSharp.RuntimeBinder.Bin der' is not defined or imported Project Name
и
Error 3 One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?....

на ошибки в регистре не обращайте внимания.
писал код в браузере для примера..
на самом деле там все намного хитрее...


код примерно такой

Код:
public void UpdateBtnsVisibility( Action<bool, dynamic> a1, Action<bool, dynamic> a2, dynamic cntr, bool vis ) 
{
// вормируем масив действий над элементом в act
List<Action<bool, dynamic>> act = new List<Action<bool, dynamic>>();
act.Add(a1);
act.Add(a2);
act.ForEach(( x ) => x(vis, cntr));
}

private void EnableDisab()
{
Action<bool, dynamic> del1 = ( bl, aRCC ) => { (aRCC as dynamic).Visible = bl; };
Action<bool, dynamic> del2 = ( bl, aRCC ) => { (aRCC as dynamic).Enabled = bl; };
UpdateBtnsVisibility(del1, del2, ribbonTab, false);
UpdateBtnsVisibility(del1, del2, adxAcuminRibbonGroup, false);
UpdateBtnsVisibility(del1, del2, adxTimeEntryRibbonButton, false);
UpdateBtnsVisibility(del1, del2, ribbonContextTimeEntry, false);
UpdateBtnsVisibility(del1, del2, ribbonContextAttachmnets, false);
}

итого UpdateBtnsVisibility ключевая функция в которую передаються пару делегатов с минимальными del1 , del2 действиями в которых десейбляться Visible и Enabled
пример немного упрашен. многое выкинуто.

Бильдиться этот код не хочет... )
userVaz вне форума Ответить с цитированием
Старый 04.05.2012, 19:43   #5
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

какая у вас таргет версия стоит в проектах? пробежитесь по всем проектам и посмотри target framework должно быть 4.0 везде

или попробуйте добавить референс на Microsoft.CSharp 4.0
Reskov вне форума Ответить с цитированием
Старый 04.05.2012, 19:46   #6
userVaz
Новичок
Джуниор
 
Регистрация: 04.05.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Reskov Посмотреть сообщение
какая у вас таргет версия стоит в проектах? пробежитесь по всем проектам и посмотри target framework должно быть 4.0 везде

или попробуйте добавить референс на Microsoft.CSharp 4.0
проекты все под 4.0 изначально делаем.
К сожалению проблема не в этом

Цитата:
Сообщение от userVaz Посмотреть сообщение
проекты все под 4.0 изначально делаем.
К сожалению проблема не в этом
пардон..
после добавления референс на Microsoft.CSharp 4.0
пропустил дальше ))
вылетают эксепшены в рунтайм..
буду разбираться.
Спасибо Reskov.

Последний раз редактировалось Stilet; 05.05.2012 в 11:33.
userVaz вне форума Ответить с цитированием
Старый 05.05.2012, 01:08   #7
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Ну так вы ошибки читайте, их для того и пишут.
А то "безуспешно"... естественно будет безуспешно.

А зачем такие извороты?
ТАм тупо свойства выставить гораздо проще и кода меньше.

Последний раз редактировалось Stilet; 05.05.2012 в 11:40.
=master= вне форума Ответить с цитированием
Старый 05.05.2012, 10:58   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Думаю, что можно сделать как-то так:
Код:
 private void UpdateBtnsVisibility (int del1, int del2, Action<bool> doEnable) 
        {
                doEnable(del1 > del2);
        }
А вызвать уже с лямда-выражением, в которое передается значение для Enable:
Код:
UpdateBtnsVisibility( 1,2, item=>textBox.Enable=item);
UpdateBtnsVisibility( 1,2, item=>button.Enable=item);
UpdateBtnsVisibility( 1,2, item=>lable.Enable=item);
Тогда можно сделать один обработчик, и использовать его для разных классов. Так же часто бывает очень удобно писать Func для функций, которые возвращают значения и оборачивать их в лямды, но это не тот случай. И лучше избегать лишний раз юзать рефлексию, в большинстве случаев можно обойтись без нее и написать более надежный код.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из простого мемо записать в поле БД Access в поле тоже типа мемо с сохранением всех абзацев пробелов Speeker БД в Delphi 2 28.11.2011 16:22
Бестиповые файлы. Последовательность чисел разного типа с чередующимися знаками lvirusl Паскаль, Turbo Pascal, PascalABC.NET 4 28.06.2011 20:46
Отображение обьектов опреденного типа в ListView Человек_Борща Общие вопросы Delphi 2 04.06.2011 23:01
Список из элементов разного типа mMAg Общие вопросы C/C++ 4 27.05.2011 20:10
функция malloc() для разного типа переменной. Serjuk Помощь студентам 46 05.01.2010 21:52