Sanyon_d Ответов: 3

Динамическое создание имени свойства


Я использую класс DynamicObject для динамического создания свойств. В почтовом методе я использую его следующим образом.(Со ссылкой на http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject%28VS.95%29.aspx[^])

dynamic person = new DynamicProp();
p.FirstName = "AA";
p.age = 10;


Но в моем лице таблица может быть изменена во время выполнения пользователем. Он может добавить больше полей, так как хочет сохранить сведения о человеке.
Затем мне нужно создать свойства в соответствии со столбцами таблицы person. В этом случае, как я могу создать свойство с помощью поля таблицы. В этом примере я должен знать имя свойства, чтобы создать его. Но я не знаю, какие имена полей создал пользователь.

3 Ответов

Рейтинг:
25

lampiclobe

Привет;
Я переписал ваш личный класс; вот он:

public class Person : DynamicObject
{
    public string Name { get; set; }
    public string Address { get; set; }
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();
    public int Count
    {
        get
        {
            return dictionary.Count;
        }
    }
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        string name = binder.Name;
        return dictionary.TryGetValue(name, out result);
    }
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        return true;
    }
    public void AddProperty<TTValue>(string key, TTValue value = default(TTValue))
    {
        dictionary[key] = value;
    }
    public void AddProperty(string typeName, string key, object value = null)
    {
        Type type = Type.GetType(typeName);
        dictionary[key] = Convert.ChangeType(value, type);
    }
}

Вы можете использовать его вот так:
dynamic p = new Person();
p.Name = "john";
p.Address = "address1";
p.Manager = "My Manager";
p.AddProperty<DateTime>("BirthDate", DateTime.Now);
p.AddProperty("System.String", "Weigth", "70 kg");
Console.WriteLine("My name is {0}\nMy manager is {1}\nMy birth Date is {2}",
    p.Name, p.Manager, p.BirthDate);
string w = p.Weigth;
Console.WriteLine("My Weigth is: " + w);
Console.ReadKey();


Надеюсь, я был вам полезен.


Sanyon_d

Спасибо за ответ. У меня возникли проблемы, как это. Я создаю объект person вот так.

в <предварительно> У человека человек=новый человек("сам","Льюис") &ЛТ;/пре&ГТ;

У него есть такие свойства.
человек.Доб
человек.Адрес

Но теперь я хочу добавить такие свойства и установить значения во время выполнения после создания объекта.
человек.Возраст
человек.Секс

lampiclobe

Привет;
Извините, что неправильно понял ваш вопрос.
Реализуйте свой класс следующим образом:
<pre lang="cs">
классный руководитель : DynamicDictionary
{
общественного строка доб;
адрес строки publis;
}
//Теперь вы можете использовать его в любом месте, как это:
public static int Main(string[] args)
{
Персона Р = новый человек();
p.Address = "некоторый адрес"; //существующее свойство
п. Менеджер = "Боб Уилкинсон" //новое свойство
}
</pre>

Примечание:класс DynamicDictionary-это класс В ссылке MSDN, которую вы дали.

Sanyon_d

Спасибо за ответ. Здесь вы знаете имя менеджера недвижимости. Но в моем случае я не знаю названия объекта. В соответствии со строковым значением в таблице я должен создать свойство.
напр..
п. AnyStringName="anyvalue";

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

lampiclobe

Привет сандживабдисса
Теперь я понимаю.
Вы хотите добавить новые свойства в виде текста. Повторная ссылка на класс DynamicDictionaty вот ваше решение:
Добавьте эти строки в конец класса Person, который я дал выше:
public void AddProperty(string propertyName, object anyValue=null)
{
словарь[propertyName.ToLower()] = любое значение;
}

Надеюсь, это было полезно.

Sanyon_d

Могу ли я воспользоваться помощью интерфейса icustomtypedescriptor

lampiclobe

вам лучше посмотреть на эту ссылку:
http://msdn.microsoft.com/en-us/magazine/cc163816.aspx

Sanyon_d

Фантастическая работа доктора озгура Сонмеза. Ваш отредактированный пример прекрасно работает для меня.Большое спасибо. Просто еще одна маленькая проблема, которая у меня все еще есть. Я создаю список объектов person и привязываю его к представлению datagrid. В названии сетки адрес отображается с помощью valus. Но динамически создаваемые свойства (Дата рождения) не показывают значения. Он показывает только имя свойства в заголовке столбца.Как я могу переступить через это? Еще раз спасибо за вашу любезную помощь.

BobJanova

Чтобы получить привязку данных для просмотра дополнительных свойств, вам необходимо реализовать ITypeDescriptor и, в частности, GetProperties.

lampiclobe

Я обновил решение. - Конечно, спасибо.

balajitk

привет лампиклоб,
я создал тот же самый класс, используя ваш код.
динамический Р = новый человек();
п. Имя = "Джон";
п. Адрес = "адрес1";
п. Менеджер = "мой менеджер"; п. AddProperty("Дата Рождения", Датавремя.Сейчас); стр. AddProperty (Системы".Струна", "Вес", "70 кг");
Приставка.Метода WriteLine("меня зовут {0}\менеджер НМУ является {1}\Дата рождения НМУ является {2}", стр. Название, С. Диспетчер, стр. Дата рождения);
строка w = p.Weigth;
Приставка.WriteLine("мой вес:" + w);
Приставка.ReadKey();
но когда я вызываю это свойство класса с помощью dynamic оно показывает ошибку следующим образом

Ошибка 202 не удается найти один или несколько типов, необходимых для компиляции динамического выражения. Вам не хватает ссылок на Microsoft.CSharp.dll и еще System.Core.dll-что?

lampiclobe

Прошли годы! О боже мой!- Ты прав, баладжитк. Вы должны добавить ссылки на библиотеки DLL, которые вы подчеркнули

Рейтинг:
0

Sanjay J Patolia

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

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

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx[^]

Выполнение отражения и обхода XML с помощью ключевого слова dynamic в языке C#[^]

Надеюсь, это вам обязательно поможет.

Спасибо :)


Рейтинг:
0

dasblinkenlight

ExpandoObject[^], реализация IDynamicMetaObjectProvider (просто нравиться DynamicObject), также реализовать IDictionary<string,Object> Предполагая, что вы знаете имена столбцов, добавленных в таблицу, и можете получить их значения, вы можете использовать синтаксис словаря для задания свойств, например:

var person=new ExpandoObject();

// You can choose between the regular property syntax
person.FirstName="Joe";

// ...and the square bracket dictionary syntax:

person["MyDynamicallyAddedProperty"]="Value of my dynamically added property";


CHill60

Разместив это в качестве комментария, только несколько человек увидят его. Почему бы не разместить свой собственный вопрос, используя красную ссылку "задать вопрос" в верхней части этой страницы. Больше людей увидят его, что делает его более вероятным, что вы получите ответ. Возможно, вам придется попытаться сделать вашу постановку проблемы немного более ясной