获取任何给定类(类型)的字段列表作为传递参数

时间:2012-12-16 01:02:53

标签: c# reflection

我想转换已经完成工作的方法

(仅当您在其体内实例化该类时)

到一个会接受被控制的类作为传递的参数...不知何故。

我试图通过反复试验得到我自己的结果, (主要是试验......和错误,很多......)

但没有成功(:

这个第一个类在我的帮助器类(扩展名称空间)

中  
public static List<string> AnyClassFieldsValuesAsList<T>(this T Clss, string nestedName)
{
    // i know how to get this to work... if an instace of the class is declared 
    // only here i would like to have any given class...as passed parameter
    // couple of tests to get a hold of the passed Class...no success (:
    var T1 = typeof(T.GetType());
    var T2 = Clss.GetType();

    return typeof(Clss.GetType()).GetFields(); //ToList<string>();
}

这是受保护的类(我存储在相同的帮助文件中)来保存表示样式字体的字符串

public class FontNames 
{
    public readonly string Aharoni = "Aharoni",
                           Andalus = "Andalus",
                           AngsanaNew = "Angsana New",
                           AngsanaUPC = "AngsanaUPC",
                           Aparajita = "Aparajita";
                           //.....etc'
}

现在在当前项目的代码之内我希望能够做类似的事情

//imports of extensions and my style namespaces ....
// then somewhere after Page_Load()...

var instnceOfFnames  = new FontNames();
list<string> FontsLst= instnceOfFnames.AnyClassFieldsValuesAsList(.....);

顶部AnyClassFieldsValuesAsList()签名中的参数仅供测试,

因为我无法与他们合作,我不确定他们是否应该通过。

获得结果的正确语法是什么?

1 个答案:

答案 0 :(得分:2)

据我所知,你需要在没有类的实例的情况下获得字段的值。我想,您应该将这些字段声明为public readonly static ...。然后,您将能够使用以下方法:

public static IEnumerable<string> GetFields<T>()
{
    Type type = typeof(T);
    return type.GetFields(BindingFlags.Static | BindingFlags.Public)
                .Where(f => f.FieldType == typeof(string))
                .Select(f => (string)f.GetValue(null));
}
像这样:

foreach (string f in GetFields<FontNames>())
     Console.WriteLine(f);

基于评论:

对于当前的问题(据我所知),它似乎是超级的,因为静态字段不需要访问实例。但至少它可以提供一些想法

public static IEnumerable<string> GetFields<T>(this T value)
{
    Type type = value.GetType();
    //...all the same as above
}

要获得相同的结果,只要没有泛型就足够了

public static IEnumerable<string> GetFields(this object value)
{
    Type type = value.GetType();
    //...all the same as above
}