Tag: reflection

如何在不使用Assembly.Load的情况下加载程序集?

可以通过将程序集流式传输到内存中来实现吗? 如果是这样,那怎么做呢? 原因: 我不想锁定加载的DLL。 我希望能够动态加载,更改代码,再次编译和重新加载它

在c#中获取字段的名称

鉴于此课程: public class MyClass { public int MyField {get; set;} } 我如何能够在代码中提取MyField的名称? 例如,我可以像这样得到类的名称 typeof(MyClass).Name 我该如何为该领域做类似的事情? 问题的原因是我希望这个特定的代码能够抵抗名称的重构。 编辑:有耐力我的意思是我希望呼叫站点的代码在字段名的变化面前是健壮的。 我有一些使用字段名称的字符串表示的东西。 对不起的措辞很糟糕。 我没有包含呼叫站点代码以保持问题清洁,而不是徘徊在有关呼叫站点代码性质的其他讨论中。

获取类实现的generics接口的类型参数

我有一个通用接口,比如IGeneric。 对于给定的类型,我想找到一个类通过IGeneric实现的generics参数。 在这个例子中更清楚: Class MyClass : IGeneric, IGeneric, IDontWantThis { … } Type t = typeof(MyClass); Type[] typeArgs = GetTypeArgsOfInterfacesOf(t); // At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) } GetTypeArgsOfInterfacesOf(Type t)的实现是什么? 注意:可以假设GetTypeArgsOfInterfacesOf方法是专门为IGeneric编写的。 编辑:请注意我特别询问如何从MyClass实现的所有接口中过滤掉IGeneric接口。 相关: 确定类型是否实现了通用接口

C#中的函数指针

我想在某些方面(或两者) Delegate或MethodInfo都有资格获得这个标题。 但是,它们都没有提供我正在寻找的语法上的好处。 所以,简而言之,有什么方法可以写下面的内容: FunctionPointer foo = // whatever, create the function pointer using mechanisms foo(); 我不能使用一个可靠的委托(即使用delegate关键字来声明委托类型),因为直到运行时才能知道确切的参数列表。 作为参考,这是我目前在LINQPad中使用的内容,其中B将是(大部分)用户生成的代码,因此Main将会如此,因此对于我的用户来说,我正在尝试删除.Call : void Main() { A foo = new B(); foo[“SomeFuntion”].Call(); } // Define other methods and classes here interface IFunction { void Call(); void Call(params object[] parameters); } class A { private class Function : IFunction { […]

C#:有人可以解释反思的实用性吗?

所以我试着搜索,希望有人对此有一个很好的解释,没有运气。 我问了我的另一个朋友一个不同的问题(我现在已经忘记了),他的回答只是在他签字之前的“反思”。 我仍然是C#世界的新手,曾经是业余的VB.net程序员(也是JavaScript,ActionScript和C),我正在尽我所能去掌握这些先进的概念。 有许多哲学答案 – “应用程序看自己” – 但它们没有提供任何实际的提示,说明实际发生的事情或在该环境中如何使用它。 那么,什么是反思,为什么重要,以及为什么/如何使用它?

EntityFramework按ID获取对象?

Generics是否可以在不知道类型的情况下从我的EntityFramework中获取对象? 我正在考虑以下方面的事情: public T GetObjectByID(int id) { return (from i in myDatabase.T where i.ID == id select i); } 那可行吗? 我可以使用Reflection以某种方式获取T.GetType().Name并将其用于表吗? 编辑 另一个问题是,并非所有可用的表都使用“ID”作为其唯一的列名。

通过reflection设置属性时键入转换问题

我们有一个long?类型的属性long? 充满了int 。 当我直接设置属性obj.Value = v;时,这工作正常obj.Value = v; 但是当我尝试通过reflection信息设置属性时info.SetValue(obj, v, null); 它给了我一个以下例外: ‘System.Int32’类型的对象无法转换为’System.Nullable`1 [System.Int64]’类型。 这是一个简化的场景: class TestClass { public long? Value { get; set; } } [TestMethod] public void TestMethod2() { TestClass obj = new TestClass(); Type t = obj.GetType(); PropertyInfo info = t.GetProperty(“Value”); int v = 1; // This works obj.Value = v; // […]

使用reflection创建表达式<Func >

我使用Moq来创建数据集的模拟。 我创建了一个小助手类,它允许我有一个内存存储而不是数据库,使unit testing变得轻而易举。 这样我可以添加和删除我的模拟数据集中的项目,这允许我测试我的插入和删除服务调用。 在模拟的设置过程中,我有一行如下所示 this.Setup(i => i.AcademicCycles).Returns(mockStore.GetList()); 我的模拟有很多属性,所以我想使用reflection执行此设置步骤。 我已经设法通过reflection工作的Returns部分,但我坚持使用lambda方法来Setup 。 Setup需要一个 Expression<Func<GoalsModelUnitOfWork, IQueryable>>对应于i => i.AcademicCycles 我想动态创建它。 使用reflection我有以下内容: 物业名称:“AcademicCycles” 类型IQueryable 类型AcademicCycle 我还在lambda语句中有一个i的实例,它是一个GoalsModelUnitOfWork

可以调用Assembly.Load(byte )来引发AppDomain.AssemblyResolve事件吗?

假设我有一个AppDomain.AssemblyResolve事件的处理程序,并在处理程序中我构造一个字节数组并调用方法Assembly.Load(byte[]) 。 此方法本身是否会导致再次引发AssemblyResolve事件,并导致我的处理程序重新进入? 我的问题不仅限于可以使用C#编译器生成的程序集,它们可以包含CLR支持的abritrary元数据和可执行代码。 我做了一些实验,发现时没有发现任何情况。 我试图加载需要额外引用的程序集,试图将CAS属性添加到加载的程序集,其解码需要另一个程序集,尝试使用模块初始化程序(全局.cctor方法)加载程序集。 在任何情况下,我都没有观察到AssemblyResolve事件是从Assembly.Load(byte[])方法内部引发的,只有在某些代码稍后尝试访问加载的程序集中的类型,方法或属性时才会发生。 但我可能会在这里遗漏一些东西。

C#通过属性reflection设置属性值

我试图通过类属性上的属性构建一个对象,该属性指定提供的数据行中的列是属性的值,如下所示: [StoredDataValue(“guid”)] public string Guid { get; protected set; } [StoredDataValue(“PrograGuid”)] public string ProgramGuid { get; protected set; } 在基础对象的Build()方法中,我将这些属性的属性值设置为 MemberInfo info = GetType(); object[] properties = info.GetCustomAttributes(true); 但是,在这一点上,我意识到我的知识有限。 首先,我似乎没有找回正确的属性。 现在我有了属性,我如何通过reflection设置这些属性? 我在做/思考一些根本不正确的事情吗?