从类型动态获取类属性值
本文关键字:属性 获取 类型 动态 | 更新日期: 2023-09-27 17:55:03
我试图编写一个方法,查找具有特定自定义属性的程序集中的所有类型。我还需要能够提供一个字符串值匹配上。需要注意的是,我希望能够在任何类上运行此操作并返回任何值。
例如:我想执行这样的调用
Type tTest = TypeFinder.GetTypesWithAttributeValue(Assembly.Load("MyAssembly"), typeof(DiagnosticTestAttribute), "TestName", "EmailTest");
到目前为止,我的方法是这样的:
public static Type GetTypesWithAttributeValue(Assembly aAssembly, Type tAttribute, string sPropertyName, object oValue)
{
object oReturn = null;
foreach (Type type in aAssembly.GetTypes())
{
foreach (object oTemp in type.GetCustomAttributes(tAttribute, true))
{
//if the attribute we are looking for matches
//the value we are looking for, return the current type.
}
}
return typeof(string); //otherwise return a string type
}
我的属性看起来像这样:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class DiagnosticTestAttribute : Attribute
{
private string _sTestName = string.Empty;
public string TestName
{
get { return _sTestName; }
}
public DiagnosticTest(string sTestName)
{
_sTestName = sTestName;
}
}
对于那些熟悉表达式的人,我真的希望能够打出这样的呼叫:
TypeFinder.GetTypesWithAttributeValue<DiagnosticTestAttribute>(Assembly.Load("MyAssembly"), x=> x.TestName, "EmailTest");
其中表达式使用我的泛型类型来选择我要查找的属性。
应该可以:
public static Type GetTypeWithAttributeValue<TAttribute>(Assembly aAssembly, Func<TAttribute, object> pred, object oValue) {
foreach (Type type in aAssembly.GetTypes()) {
foreach (TAttribute oTemp in type.GetCustomAttributes(typeof(TAttribute), true)) {
if (Equals(pred(oTemp), oValue)) {
return type;
}
}
}
return typeof(string); //otherwise return a string type
}
或者更好:
public static Type GetTypeWithAttributeValue<TAttribute>(Assembly aAssembly, Predicate<TAttribute> pred) {
foreach (Type type in aAssembly.GetTypes()) {
foreach (TAttribute oTemp in type.GetCustomAttributes(typeof(TAttribute), true)) {
if (pred(oTemp)) {
return type;
}
}
}
return typeof(string); //otherwise return a string type
}
调用是这样的:
GetTypeWithAttributeValue<DefaultValueAttribute>(Assembly.GetCallingAssembly(), attribute => attribute.Value,
"string");
和这个分别:
GetTypeWithAttributeValue<DefaultValueAttribute>(Assembly.GetCallingAssembly(),
attribute => attribute.Value == "string");
很久以前,我开发了一些辅助方法来从表达式中提取属性名称,
我想这对你会有用的。
public static string Item<TItem, TMember>(this TItem obj, Expression<Func<TItem, TMember>> expression)
{
if (expression.Body is MemberExpression)
{
return ((MemberExpression)(expression.Body)).Member.Name;
}
if (expression.Body is UnaryExpression)
{
return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand).Member.Name;
}
if (expression.Body is ParameterExpression)
{
return expression.Body.Type.Name;
}
throw new InvalidOperationException();
}