Как правильно получить доступ к общедоступному свойству UserControl по строке - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть набор пользовательских элементов управления на странице, которые динамически загружаются в зависимости от условия для запуска различных отчетов (драйвер условия). Каждый элемент управления имеет одно или несколько открытых свойств, которые будут использоваться для получения данных из моего запроса к базе данных. Поскольку элементы управления различаются для каждого отчета, я написал процедуру доступа к свойству соответствующего элемента управления по имени, чтобы я мог отправить его в запрос к базе данных в коде (C #). Я получил все настройки для доступа к публичному свойству, как это:

stringVal = userControl.Attributes[stringName].ToString();

и он говорит мне, что мне нужно создать новый объект. Я не понимаю, как мне нужно получить доступ к этому свойству динамически по имени строки. В моем непосредственном окне я могу видеть собственность, которую я хочу; но это не «Атрибут», как control.Attributes.Count = 0. Итак, как мне нужно настроить это правильно, чтобы я мог получить доступ к нему по имени строки? Нужно ли украшать недвижимость чем-то?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Ниже я написал класс-оболочку, который вы можете использовать для установки / получения открытых полей или свойств упакованного класса по строковому имени.

Сначала давайте посмотрим, как вы можете использовать его в классе с открытыми полями или свойствами StartDate и SocialSecurityNumber.

// First create the instance we'll want to play with
MyUserControl myControlInstance = new MyUsercontrol();
// MyUserContol has two properties we'll be using
// DateTime StartDate
// int SocialSecurityNumber

// Now we're creating a map to facilitate access to the properties
// of "myControlInstance" using strings
PropertyMap<MyUserControl> map = 
             new PropertyMap<MyUserControl>(myControlInstance);

// Since the map is directed toward "myControlInstance"
// this line is equivalent to:
// myControlInstance.StartDate = Datetime.Now;
map.Set<DateTime>("StartDate", DateTime.Now);

// This line is equivalent to:
// ssn = myUsercontrol.SocialSecurityNumber;
int ssn = map.Get<int>("SocialSecurityNumber");

А теперь о том, как это реализовано:

public class PropertyMap<T>
{
    readonly T Instance;

    public PropertyMap(T instance)
    {
        Instance = instance;
    }

    public U Get<U>(string PropertyName)
    {
        // Search through the type's properties for one with this name
        // Properties are things with get/set accessors
        PropertyInfo property = typeof(T).GetProperty(PropertyName);
        if (property == null)
        {
            // if we couldn't find a property, look for a field.
            // Fields are just member variables, but you can only
            // manipulate public ones like this.
            FieldInfo field = typeof(T).GetField(PropertyName);
            if (field == null)
                throw new Exception("Couldn't find a property/field named " + PropertyName);
            return (U)field.GetValue(Instance);
        }
        return (U)property.GetValue(Instance, null);
    }

    public void Set<U>(string PropertyName, U value)
    {
        // Search through the type's properties for one with this name
        PropertyInfo property = typeof(T).GetProperty(PropertyName);
        if (property == null)
        {
            // if we couldn't find a property, look for a field.
            FieldInfo field = typeof(T).GetField(PropertyName);
            if (field == null)
                throw new Exception("Couldn't find a property/field named " + PropertyName);
            field.SetValue(Instance, value);
            return;
        }
        property.SetValue(Instance, value, null);
    }
}
0 голосов
/ 01 февраля 2012

Вам нужно изучить отражение. Это относится к манипулированию метаданными типов .NET (классы, структуры, перечисления и т. Д.). Однако, если вы запускаете свое приложение на виртуальном хостинге с частичным доверием, возможно, вам вообще не удастся запустить какой-либо код отражения (ограничение безопасности на сервере). Если это так, сначала протестируйте небольшой / быстрый пример (на своем хостинге), а затем примите правильное решение: переделать ли ваше приложение или сменить хост.

Фрагмент, связанный с отражением, который может быть вам полезен (вставьте его где-нибудь в класс пользовательского элемента управления, так как this.GetType() имеет значение:

var properties = this.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

foreach (var p in properties)
{
    string propertyName = p.Name;
}

Есть другие способы получить тип; например typeof(yourclassname); Вы также можете отразить / получить все типы из данной сборки (dll) и многое другое.

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