如何在不实例化对象的情况下定义属性以从中读取属性?

时间:2011-04-13 19:56:22

标签: c#

假设我有:

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”)
感谢

5 个答案:

答案 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

这对我的目的来说效果很好,但仍会导致一些代码重复(作为枚举声明)。但这确实解决了字符串文字的问题,现在您可以安全地重构代码。