我的MVC5自定义Html助手类有以下方法:
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);
我的问题是如何将这些字符串表示转换为实际类或其他解决方法。
谢谢!
答案 0 :(得分:2)
我不认为通用方法会对你的情况起作用,我会解释原因。
如果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()
)将帮助您找到您要找的东西。