Tag: reflection

在没有新约束的情况下创建T的新实例

如果想要创建generics的新实例,则需要定义新约束 ,如下所示: public T SomeMethod() where T : new() { return new T(); } 是否可以使用reflection在没有新约束的情况下创建T的实例,如此(包含伪代码): public T SomeMethod() { if (T has a default constructor) { return a new instance of T; } else { return Factory.CreateNew(); } }

如何将C#属性名称作为带reflection的字符串?

可能重复: c# – 如何获得变量的名称,因为它在声明中是物理输入的? 我正在寻找一种方法来获取属性名称作为字符串,所以我可以有一个“强类型”魔术字符串。 我需要做的是像MyClass.SomeProperty.GetName()这样会返回“SomeProperty”。 这可能在C#中吗?

只知道类名创建一个对象?

我有一组课程,每一个课程都是做同样工作的不同策略 。 namespace BigCorp.SuperApp { public class BaseClass { } public class ClassA : BaseClass { } public class ClassB : BaseClass { } } 选择使用哪种策略是可配置的。 我想在app.config文件中只配置类名“ClassB”而不是完整类型名称“BigCorp.SuperApp.ClassB”。 但是,reflection调用失败,因为它们期望完整的类型名称,尤其是 Type t = Type.GetType(“ClassB”); // results in t == null BaseClass c = Activator.CreateInstance(t) as BaseClass; // fails 如何在仅配置类名时才能使其工作? 将名称空间连接到完整类型名称的类名? 是否有其他reflection调用有效? 如果你认为这是无用的,我希望配置包含完整的类型名称,我对这个解决方案持开放态度! 只是提供说服我的理由。 (我不会从此程序集/命名空间外部加载类型)

如何检查方法是否具有属性

我有一个示例类 public class MyClass{ ActionResult Method1(){ …. } [Authorize] ActionResult Method2(){ …. } [Authorize] ActionResult Method3(int value){ …. } } 现在我想要的是编写一个返回true / false的函数,可以像这样执行 var controller = new MyClass(); Assert.IsFalse(MethodHasAuthorizeAttribute(controller.Method1)); Assert.IsTrue(MethodHasAuthorizeAttribute(controller.Method2)); Assert.IsTrue(MethodHasAuthorizeAttribute(controller.Method3)); 我到了那里 public bool MethodHasAuthorizeAttribute(Func function) { return function.Method.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0; } 适用于Method3。 现在我怎么能以一种将字符串和类作为参数的方式来做那个generics呢?

如果GetFields()不保证顺序,LayoutKind.Sequential如何工作

我需要在声明顺序的保证顺序中获取fieldinfo。 现在我正在使用属性来指定顺序。 有更自动的方式吗? 有没有人知道LayoutKind.Sequential如何工作,以及我是否可以应用它的技术。 我没有看到LayoutKind.Sequential如何工作,除非有一些预编译器代码添加属性。

C#中的reflection和运算符重载

这是交易。 我有一个程序将加载给定的程序集,解析所有类型及其成员并编译TreeView(非常类似于旧的MSDN站点),然后为TreeView中的每个节点构建HTML页面。 它基本上采用给定的程序集,并允许用户为文档目的创建自己的类似MSDN的库。 这是我遇到的问题:只要在定义的类中包含操作符重载,reflection就会将其作为“MethodInfo”返回,其名称设置为“op_Assign”或“op_Equality”。 我希望能够捕获这些并正确列出它们,但是我找不到返回的MethodInfo对象中的任何内容来准确识别我正在查看运算符。 我绝对不想只捕获以“op_”开头的所有内容,因为这肯定会(在某些时候)会选择一个它不应该采用的方法。 我知道像这样的“特殊情况”的其他方法和属性设置了“IsSpecialName”属性,但显然不是运算符的情况。 我一直在搜索’网络并且把我的大脑震撼了两天试图找出这个,所以任何帮助都将非常感激。

如何通过reflection判断C#方法是否异步/等待?

例如 class Foo { public async Task Bar() { await Task.Delay(500); } } 如果我们反思这个类和方法,我如何确定这是否是一个真正的async / await方法,而不仅仅是一个碰巧返回任务的方法? class Foo { public Task Bar() { return Task.Delay(500); } }

C#可重用函数转储局部变量的当前值

我想编写一个可重用的函数,我可以在任何方法中调用它来记录所有局部变量的快照。 例如: void somemethod() { int a = 1; string s = “something”; dumpLocalVariables(“step 1”, MethodInfo.GetCurrentMethod(), this); a++; string t = s + “else”; dumpLocalVariables(“step 2”, MethodInfo.GetCurrentMethod(), this); } 我想获得这样的控制台输出: step 1 Int32 a = 1 String s = something step 2 Int32 a = 2 String s = something String t = somethingelse 我想避免提供一个特定的局部变量名列表。 […]

使用reflection在C#中创建动态LINQ语句

如果我有一个像LINQ语句 x = Table.SingleOrDefault(o => o.id == 1).o.name; 如何使用reflection传入变量替换“id”和“name”? 我尝试时,我不断将对象引用设置为对象错误的实例。 我的尝试就是这样的 x = (string)Table.SingleOrDefault(o => (int?)o.GetType().GetProperty(idString) .GetValue(o, null) == 1).GetType().GetField(nameString).GetValue(x); 任何帮助都会很棒。 谢谢。

使用Lambda表达式获取方法名称

我试图使用lambda表达式获取类型的方法名称。 我正在使用Windows Identity Foundation,需要定义具有类型名称的访问策略,其中命名空间作为资源,方法名称作为操作。 这是一个例子。 这是我将从以下类型获取类型名称和方法名称的类型: namespace My.OrderEntry { public class Order { public void AddItem(string itemNumber, int quantity) {} } } 这就是我想通过DSL定义访问策略的方法: ForResource().Performing(o => o.AddItem).AllowUsersHaving(new Claim()); 从该声明中,我想将“My.OrderEntry.Order”作为资源,将“AddItem”作为动作。 获取带有命名空间的类型名称是没有问题的,但我认为我不能将lambda用于我正在尝试的方法。 public static IPermissionExp Performing( this IActionExp exp, Func action) {} //this is where I don’t know what to define 这种事情甚至可能吗? 是否有另一种方法可以在不使用魔术字符串的情况下完成此类操作?