Получение значения свойства на основе его значения атрибута столбца
List<MyModel1> myModel1 = new List<MyModel1>();
MyUserModel myUserModel = new MyUserModel();
List<MyModel2> myModel2 = new List<MyModel1>();
myModel1 = m_Service1.GetMyModelFields();
myUserModel = m_Service2.GetMyUserDetails();
myModel2 = (from myModel1Field in myModel1
select new MyModel2 { FieldCaption = myModel1Field.FieldAlias,
FieldValue = "" }).ToList<MyModel2>();
myModel1Field.FieldAlias текст будет таким же, как значение одного из атрибутов Column одного из свойств в myUserModel. Поэтому мне нужно найти атрибут столбца (Name) в myUserModel и получить соответствующие значения свойств и назначить его "FieldValue". Если я не могу найти значение в myUserModel, я могу установить "FieldValue" как "NA"
Один из способов получить значение атрибута column (Name) для свойства, как указано ниже, когда я знаю имя свойства.
myUserModel.GetType().GetProperty("FirstName").GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).Cast<System.Data.Linq.Mapping.ColumnAttribute>().Single().Name
Но в моем случае имя свойства не будет известно. Мне нужно найти свойство, основанное на значении myModel1Field.FieldAlias. Как это сделать. Пожалуйста, предложите.
MyUserModel с одним из свойств
public class MyUserModel {
[Column(Name = "first_name", DbType = "varchar")]
public string FirstName { get; set; }
}
Теперь, если myModel1Field.FieldAlias является "first_name", тогда мне нужно выполнить поиск в MyUserModel для свойства с атрибутом Column (Name) как first_name. Если он существует, мне нужно установить значение "FieldValue". Else установить "FieldValue" как "NA".
Ответы
Ответ 1
Если вы хотите получить значение свойства, и вы знаете только свойство Name одного из атрибутов ColumnAttribute, что вы можете сделать, так это:
// Let say you have the user model like so:
MyUserModel myUserModel = new MyUserModel { FirstName = "A", LastName = "B"};
// And then you want the value of the property that has the Column attribute Name "first_name"
string searchName = "first_name";
// Using some lambda you can do this (I do not know how to do this in LINQ syntax, sorry)
object propertyValue = typeof (MyUserModel).GetProperties()
.Where(p =>
{
var attrib = (ColumnAttribute)p
.GetCustomAttributes(typeof (ColumnAttribute), false)
.SingleOrDefault();
return (attrib != null &&
attrib.Name.Equals(searchName));
})
.Select(p => p.GetValue(myUserModel, null))
.FirstOrDefault();
if(propertyValue != null)
{
// Do whatever you want with the string "A" here - I suggest casting it to string! :-)
}
Это то, что вы хотите?