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