Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将字符串变量转换为对象类型引用_C#_Generics_Asp.net Mvc 5_Custom Attributes_System.reflection - Fatal编程技术网

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

C#将字符串变量转换为对象类型引用,c#,generics,asp.net-mvc-5,custom-attributes,system.reflection,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

我的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
}
publicstaticboolcheckaccessright(此HtmlHelper、字符串操作、字符串控制器)
{
字符串displayName=GetPropertyDisplayName(i=>i.Action);
//根据逻辑返回布尔
}
GetPropertyDisplayName方法:

public static string GetPropertyDisplayName<T>(Expression<Func<T, object>> propertyExpression)
{
// some code
}
公共静态字符串GetPropertyDisplayName(表达式propertyExpression)
{
//一些代码
}
正如您所看到的,GetPropertyDisplayName方法需要一个类(类型)和类成员作为其参数

但在我的CheckAccessRight方法中,我只是接收类名(
stringcontroller
)和成员(
stringaction
)作为字符串

很明显,我在这段代码中遇到了一个错误:
(I=>I.Action)

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


谢谢

我不认为通用方法适用于您的情况,我会解释原因

给定一个值为类型名称的
字符串
,可以使用以下方法获得
类型
对象:

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   
}
公共静态字符串GetPropertyDisplayName(类型类型,表达式propertyExpression)
{
//一些代码
}

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

您可以使用反射。没办法。