C#将字符串变量转换为对象类型引用

时间:2014-08-10 17:24:19

标签: c# generics asp.net-mvc-5 custom-attributes system.reflection

我的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);

我的问题是如何将这些字符串表示转换为实际类或其他解决方法。

谢谢!

1 个答案:

答案 0 :(得分:2)

我不认为通用方法会对你的情况起作用,我会解释原因。

如果string的值是类型名称,则可以使用以下内容获取Type对象:

var type = AppDomain.CurrentDomain.GetAssemblies()
              .SelectMany(x => x.DefinedTypes)
              .Single(x => x.Name == typeName);

现在,问题出现了:type只会在运行时知道,因为它取决于typeNametypeName只在运行时才知道。在泛型中,需要在编译时知道类型参数(当解析表达式时,其他类型参数在编译时基于给定的约束起作用)。这就是为什么没有针对这个问题的解决方法(据我所知)。

然后,你必须采用运行时解决方案。我能想象到的最明显的事情是你可以采取类型并分析它提供的内容:

public static string GetPropertyDisplayName(Type type, Expression<Func<object, object>> propertyExpression)
{
    // some code   
}

代码根据您要从类型中提取的信息而有所不同,但通常有一些方法(如GetMembers()GetMethods()GetProperties()GetCustomAttributes())将帮助您找到您要找的东西。