Я пытаюсь получить значения определенных полей класса на основе их имен и наличия настраиваемого атрибута посредством отражения.
Мой пользовательский атрибут:
[AttributeUsage (AttributeTargets.All, AllowMultiple=true)]
public sealed class ColumnAttribute : Attribute
{
internal string name = "";
internal string length = "";
internal string precision = "";
public ColumnAttribute() { }
public ColumnAttribute(String name) { this.name = name; }
public ColumnAttribute(String name, String length) { }
public ColumnAttribute(String name, String length, String precision) { }
public String Name { get { return name; } set { name = value; } }
public String Length { get { return length; } set { length = value; } }
public String Precision { get { return precision; } set { precision = value; } }
}
Пример класса, который использует это:
class SampleEntity
{
//private int number;
public string name;
//float marks;
public virtual int Number { get; set; }
public SampleEntity() { }
public SampleEntity(int number)
{
this.Number = number;
}
public void conversation(string request, string response) { }
public void ordinary() {
Console.Write("This isn't ordinary...");
}
[ColumnAttribute (Name = "XWBCCD")]
public String XWBCCD { get; set; }
[ColumnAttribute (Name = "XWBNCD")]
public String XWBNCD { get; set; }
У меня также есть другой класс с разными именами полей:
class SampleRepository
{
[ColumnAttribute(Name = "XWBCCD")]
public String SomeOtherFieldName { get; set; }
[ColumnAttribute(Name = "XWBNCD")]
public String XWBNCD { get; set; }
[ColumnAttribute(Name = "XWBWCD")]
public String XWBWCD { get; set; }
}
Посредством размышления я пытаюсь скопировать значения, сопоставляя параметр «имя» атрибута, а не имя поля.
Проблема в том, что во время отражения такое сравнение не происходит с помощью метода getCustomAttributes (), переданного по полям.
Мой подход к решению этой проблемы (до сих пор не удается) был:
Сначала я передаю 2 объекта: objSrc (первого заполненного класса) и objDesc (второго пустого класса)
FieldInfo[] srcFields = objSrc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.IgnoreCase |BindingFlags.FlattenHierarchy);
FieldInfo[] destFields = objDest.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
Тогда я пытаюсь итеративно выполнить отражение по всем полям
foreach (FieldInfo srcFld in srcFields)
{
foreach (FieldInfo destFld in destFields)
{
if (((MemberInfo)srcFld).Name.Equals(((MemberInfo)destFld).Name)){
destFld.SetValue(objDest, srcFld.GetValue(objSrc));
break;
}
object[] srcAttr = srcFld.GetCustomAttributes(true);
object[] destAttr = destFld.GetCustomAttributes(true);
if (Utils.Length(srcAttr) == 1 && Utils.Length(destAttr) == 1){
if ((srcAttr[0]).Equals(destAttr[0]) && srcFld.FieldType.Equals(destFld.FieldType))
destFld.SetValue(objDest, srcFld.GetValue(objSrc));
else
break;
}
}
}
Проблема возникает в методе GetCustomAttributes (), так как он возвращает значение NULL.