假设我有:
class Person
{
[ColumnAttribute("ID"]
public int Id;
[ColumnAttribute("Name"]
public string Name;
[ColumnAttribute("DateOfBirth"]
public date BirthDate;
}
我想在某些属性上读取属性,但不想实现Person对象。比方说,我想读取Name属性上定义的属性。但是我想让它像ReadAttribute(Person.Name)一样,而不创建对象。
为什么我要这样?因为这个Person对象是我正在创建的框架的Entity对象,我希望能够定义我想要从DAL层对返回进行排序的列。
我不想传递字符串,因为当我更改数据库等时,字符串会不同步。
这可能吗? dal的功能是Person.GetAllByAge(int Age,/ 在某种程度上我想在这里定义排序 /)
如果有另一种方法来解决这个问题,我将很高兴听到它。我想考虑使用表达式树,但我也被困在那里
感谢
谢谢大家的回答,但问题不在于阅读属性
我想在呼叫dal时调用类似的东西
Dal.Person.GetAllByAge(25,BirthDate)
这将返回所有25岁的人按姓名分类
这可以通过调用
来实现
Dal.Person.GetAllByAge(25,“DateOfBirth”)
感谢
答案 0 :(得分:3)
除Pete M's answer之外,您可以将Func<T1,T2>
中使用的IEnumerable<T>.OrderBy
传递给您的方法,并在您的方法中进行排序
public IEnumerable<Person> GetAllByAge<T>(int age, Func<Person,T> orderBy)
{
var people = ... (get your collection of 'age' aged people here)
return people.OrderBy(orderBy);
}
然后使用Dal.Person.GetAllByAge(25,p => p.BirthDate)
答案 1 :(得分:1)
是的,我定义了一个扩展方法,使其更容易一些,所以我可以调用typeof(Person).GetAttributes<CollumnAttribute>()
:
/// <summary>
/// Loads the configuration from assembly attributes
/// </summary>
/// <typeparam name="T">The type of the custom attribute to find.</typeparam>
/// <param name="typeWithAttributes">The calling assembly to search.</param>
/// <returns>An enumeration of attributes of type T that were found.</returns>
public static IEnumerable<T> GetAttributes<T>(this Type typeWithAttributes)
where T : Attribute
{
// Try to find the configuration attribute for the default logger if it exists
object[] configAttributes = Attribute.GetCustomAttributes(typeWithAttributes,
typeof(T), false);
// get just the first one
if (configAttributes != null && configAttributes.Length > 0)
{
foreach (T attribute in configAttributes)
{
yield return attribute;
}
}
}
答案 2 :(得分:1)
是否有特定原因强制对GetAllByAge()
方法本身进行排序?一旦你找回它,为什么不对它进行排序?逻辑顺序是否需要在服务器端发生?我会返回一个List<Person>
(你提到自己做了)并使用LINQ根据需要订购该套装,除非我有充分的理由不这样做:
Dal.Person.GetAllByAge(25).OrderBy(p => p.BirthDate);
答案 3 :(得分:0)
如果不实例化Person
对象,这绝对可行。您将需要使用Reflection来访问该属性,特别是GetCustomAttributes
方法。
Here's an article for reference.
你的最终结果可能最终看起来像这样:
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(typeof(Person)); // Reflection.
答案 4 :(得分:0)
属性不允许lambdas作为参数,所以遗憾的是p => p.BirthDate
是不可能的。在类似的情况I used enums to link things together。
这对我的目的来说效果很好,但仍会导致一些代码重复(作为枚举声明)。但这确实解决了字符串文字的问题,现在您可以安全地重构代码。