我想转换已经完成工作的方法
(仅当您在其体内实例化该类时)
到一个会接受被控制的类作为传递的参数...不知何故。
我试图通过反复试验得到我自己的结果, (主要是试验......和错误,很多......)
但没有成功(:
这个第一个类在我的帮助器类(扩展名称空间)
中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()
签名中的参数仅供测试,
因为我无法与他们合作,我不确定他们是否应该通过。
获得结果的正确语法是什么?
答案 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
}