C# 作为传递的参数从任何给定类(类型)的

C# 作为传递的参数从任何给定类(类型)的,c#,reflection,C#,Reflection,我想转换一个已经完成这项工作的方法 (仅当在类的主体中实例化该类时) 对于一个将接受subject类作为传递参数的类…不知何故 我试着通过尝试和错误来获得这个结果, (主要是试验…和错误,批次…) 但是没有成功(: 第一个类在我的助手类(扩展名称空间)中 public static List anyclassfields值列表(此T Clss,字符串nestedName) { //我知道如何让它工作…如果类的instance被声明 //仅在这里,我希望将任何给定的类…作为传递参数 //两次测试以

我想转换一个已经完成这项工作的方法

(仅当在类的主体中实例化该类时)

对于一个将接受subject类作为传递参数的类…不知何故

我试着通过尝试和错误来获得这个结果, (主要是试验…和错误,批次…)

但是没有成功(:

第一个类在我的助手类(扩展名称空间)中

public static List anyclassfields值列表(此T Clss,字符串nestedName)
{
//我知道如何让它工作…如果类的instance被声明
//仅在这里,我希望将任何给定的类…作为传递参数
//两次测试以获得通过的类…未成功(:
var T1=typeof(T.GetType());
var T2=Clss.GetType();
返回typeof(Clss.GetType()).GetFields();//ToList();
}
这是subject类(我存储在同一个helpers文件中),用于保存表示样式字体的字符串

公共类名
{
公共只读字符串Aharoni=“Aharoni”,
Andalus=“Andalus”,
AngsanaNew=“Angsana New”,
AngsanaUPC=“AngsanaUPC”,
Aparajita=“Aparajita”;
//……等等'
}
现在,在当前项目的代码隐藏中,我希望能够执行以下操作

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

var instnceOfFnames  = new FontNames();
list<string> FontsLst= instnceOfFnames.AnyClassFieldsValuesAsList(.....);
//导入扩展和我的样式名称空间。。。。
//然后在Page_Load()之后的某个地方。。。
var instnceOfFnames=new FontNames();
list FontsLst=INSTNCEOFFNAME.anyClassFieldsValuesList(…);
顶部签名为
AnyClassFieldsValuesAsList()
的参数仅用于测试

因为我不能和他们一起工作,我不确定他们是我应该通过的


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

据我所知,您需要在不使用类实例的情况下获取字段值。我想,您应该将这些字段声明为
公共只读静态…
。然后您就可以使用以下方法:

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));
}
公共静态IEnumerable GetFields()
{
类型=类型(T);
返回类型.GetFields(BindingFlags.Static | BindingFlags.Public)
.其中(f=>f.FieldType==typeof(字符串))
.Select(f=>(string)f.GetValue(null));
}
像这样:

foreach (string f in GetFields<FontNames>())
     Console.WriteLine(f);
foreach(GetFields()中的字符串f)
控制台写入线(f);

根据评论:

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

public static IEnumerable<string> GetFields<T>(this T value)
{
    Type type = value.GetType();
    //...all the same as above
}
公共静态IEnumerable GetFields(此T值)
{
Type Type=value.GetType();
//……同上
}
要得到相同的结果,不使用泛型就足够了

public static IEnumerable<string> GetFields(this object value)
{
    Type type = value.GetType();
    //...all the same as above
}
公共静态IEnumerable GetFields(此对象值)
{
Type Type=value.GetType();
//……同上
}

@kosta zdravstvuy…(;你知道如何将其转化为扩展方法吗?你是否考虑过这种方法的另一个版本?(顺便说一句,它按原样工作)或者..你的sggustion的方式,实际上并不需要一个..因为它很容易实现,只需要把给定的类名…作为参数…所以如果我会像你建议的那样(公共静态…)它甚至不是必需的,因为扩展版本不会提供benefits@LoneXcoder扩展方法需要一个对象的实例作为第一个参数,这对于静态字段来说毫无意义。但是如果你有一个目标类的实例,并且需要做同样的事情,你可以稍微更改它。我将更新我的答案…我正在检查bOther Ienumerable vs List,结果是到目前为止的List,它在200个文件(字符串)上的10K迭代速度提高了30倍,是吗?