将字符串变量转换为对象类型引用
本文关键字:对象 类型 引用 转换 字符串 变量 | 更新日期: 2023-09-27 18:17:16
我的MVC5自定义Html helper类有以下方法:
public static bool CheckAccessRight(this HtmlHelper htmlHelper, string Action, string Controller)
{
string displayName = GetPropertyDisplayName<Controller>(i => i.Action);
// according to logic return a bool
}
GetPropertyDisplayName方法:
public static string GetPropertyDisplayName<T>(Expression<Func<T, object>> propertyExpression)
{
// some code
}
你可以看到GetPropertyDisplayName方法期待一个类(类型)和类成员作为它的参数。
但是在我的CheckAccessRight方法我只是接收类名(string Controller
)和成员(string Action
)作为字符串。
显然在这段出现了错误:<Controller>(i => i.Action);
我的问题是如何将这些字符串表示转换为真正的类或其他解决方案。
谢谢!
我不认为泛型方法会在你的情况下工作,我会解释为什么。
给定一个值为类型名的string
,您可以使用以下方法获得Type
对象:
var type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.DefinedTypes)
.Single(x => x.Name == typeName);
现在,这里的问题:type
将只在运行时已知,因为它依赖于typeName
和typeName
只在运行时已知。在泛型中,类型参数需要在编译时已知(解析表达式时,根据给定的约束,其他类型参数表现为编译时已知)。这就是为什么没有解决这个问题的方法(据我所知)。
那么,你必须求助于这个的运行时解析。我能想到的最明显的事情是,你可以取这个类型并分析它提供的内容:
public static string GetPropertyDisplayName(Type type, Expression<Func<object, object>> propertyExpression)
{
// some code
}
代码根据您想要从类型中提取的信息而变化,但通常有方法(如GetMembers()
, GetMethods()
, GetProperties()
和GetCustomAttributes()
)可以帮助您定位您正在寻找的内容。