Tag: reflection

C#使用reflection来创建结构

我目前正在编写一些代码,使用c#中的reflection将常规对象保存到XML。 问题是当读取某些对象中的XML是结构体时,我无法弄清楚如何初始化结构体。 对于我可以使用的课程 ConstructorInfo constructor = SomeClass.GetConstructor(Type.EmptyTypes); 但是,对于结构体,没有没有参数的构造函数,因此上面的代码将构造函数设置为null。 我也试过了 SomeStruct.TypeInitializer.Invoke(null) 但是这会抛出一个元素。 谷歌没有提供有希望的点击率。 任何帮助,将不胜感激。

动态调用通用目标上的方法

我有一个通用接口ICommandHandler ,它将具有许多实现,每个实现用于处理ICommand的特定实现,例如: public class CreateUserCommand : ICommand { … } public class CreateUserCommandHandler : ICommandHandler { … } 当我给出一个ICommand对象时,我试图将它动态地分配给正确的ICommandHandler 。 目前我在调度程序类中使用了一个非常直接的reflection方法和一个Invoke : public void Dispatch(T command) where T : ICommand { Type commandType = command.GetType(); Type handlerType = typeof(ICommandHandler).MakeGenericType(commandType); object handler = IoC.Get(handlerType); MethodInfo method = handlerType.GetMethod(“Handle”); method.Invoke(handler, new object[] { command }); } 这种方法存在两个问题。 […]

reflection在方法中获取变量

我怎样才能获得Method中使用的变量,然后我将在Console上写下它们的值?

你会如何改进这种浅层复制课程?

我用一个静态方法编写了一个类,它将属性值从一个对象复制到另一个对象。 它不关心每个对象是什么类型,只关心它们具有相同的属性。 它做了我需要的,所以我不会进一步设计它,但你会做出哪些改进? 这是代码: public class ShallowCopy { public static void Copy(From from, To to) where To : class where From : class { Type toType = to.GetType(); foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)) { toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null); } } } 我正在使用它如下: EmployeeDTO dto = GetEmployeeDTO(); Employee employee = new Employee(); […]

如何使用带有C#/ .NET的Reflection实例化程序集中的类?

我有这个库编译为calc.dll。 namespace MyClass { public class Calculator { public int Value1 {get; set;} public int Value2 {get; set;} public Calculator() { Value1 = 100; Value2 = 200; } public int Add(int val1, int val2) { Value1 = val1; Value2 = val2; return Value1 + Value2; } } } 我想实例化Calculate类而不链接到calc.dll。 C#可以做到吗? 我想出了这个代码,但我不知道如何实例化Calculator类。 using System; using System.IO; […]

在运行时编译代码,加载到当前appdomain但Type.GetType无法看到它

我在运行时编译一些代码,然后将程序集加载到当前的appdomain,但是当我尝试做Type.GetType时,它无法找到类型… 以下是我编译代码的方法…… public static Assembly CompileCode(string code) { Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); ICodeCompiler compiler = provider.CreateCompiler(); CompilerParameters compilerparams = new CompilerParameters(); compilerparams.GenerateExecutable = false; compilerparams.GenerateInMemory = false; foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { string location = assembly.Location; if (!String.IsNullOrEmpty(location)) { compilerparams.ReferencedAssemblies.Add(location); } } catch (NotSupportedException) { // this happens for dynamic assemblies, […]

C#Buddy课程/元数据和反思

我试图使用reflection来检查给定类上的属性是否设置了ReadOnly属性。 我正在使用的类是MVC视图模型(使用元数据的部分“伙伴”类。 public partial class AccountViewModel { public virtual Int32 ID { get; set; } public virtual decimal Balance { get; set; } } [MetadataType(typeof(AccountViewModelMetaData))] public partial class AccountViewModel { class AccountViewModelMetaData { [DisplayName(“ID”)] public virtual Int32 ID { get; set; } [DisplayName(“Balance”)] [DataType(DataType.Currency)] [ReadOnly(true)] public virtual decimal Balance { get; set; } } } […]

如何在使用Reflection.SetValue时提供转换?

我有一个假装成int的类,所以它已经超载了各种运算符; public class MyId { int value; public virtual int Value { get { return this.value; } set { this.value = value; } } public MyId(int value) { this.value = value; } public static implicit operator MyId(int rhs) { return new MyId(rhs); } public static implicit operator int(MyId rhs) { return rhs.Value; } } 但是,当我使用代码时 […]

为什么在Log4Net中命名了logger?

我一直在研究使用Castle Windsor将Log4Net ILog注入类的方法。 在大多数例子中,我看到Castle Windsor可以提供一个提供属性注入的“辅助器”,并注入ILogger(而不是ILog)。 我只找到了一个使用构造函数注入的示例,并且未使用辅助方法(请参阅Castle Windsordependency injection:使用调用方类型作为参数 ) 在所有这些示例中,似乎Log4Net想要一个命名的记录器。 大多数示例引用Log4Net静态方法LogManager.GetLogger(此处为类名)。 这使得在不使用reflection或辅助方法的情况下定义CastleWindsor的依赖性是一个挑战(辅助方法可以与ctor注入一起使用)。 在查看Ilya Kogan的问题(上面的URL …)时,我想我不明白为什么需要,甚至想要一个命名的记录器。 我不能在任何地方使用同名的记录器吗? 例如,我不能只用硬编码的XXX名称注册记录器吗? (它似乎工作正常,最后,我只想记录 – 我不关心哪个记录器记录它…)是否存在范围问题? 是否存在内存泄漏问题? 为什么记录器不能/不应该是单件? public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component.For().UsingFactoryMethod(() => log4net.LogManager.GetLogger(“xxx”)) ); } 更新: 经过一些研究,可以使用硬编码的命名记录器 – 例如上面示例中的XXX,但是如果记录器的配置将记录器名称输出到日志文件,并且记录器名称是动态分配给与方法相同的名称,或者class,您自动获取对日志来源的引用。 日志文件中的上下文可能非常有用。 当专门针对ctor注射时,似乎有5种可能的选择…… 使用单例而不使用命名记录器(因此不会在日志文件中报告) 使用ctor注射reflection(如Ilya Kogan的例子中所示) 使用财产注入(通过协调人) 使用后尖锐的AOP IL Injection进行记录 使用CTOR注射(通过促进者)

有没有办法确定generics类型是否是从特定的generics类型定义构建的?

我有一个通用的方法: Func<IEnumerable, bool> CreateFunction() 其中T可以是任意数量的不同类型。 这个方法使用reflection做一堆东西,如果T是一个IDictionary ,不管字典的TKey和TValue我需要执行字典特定的代码。 所以可以调用该方法: var f = CreateFunction(); var f0 = CreateFunction(); var f1 = CreateFunction<IDictionary>(); var f2 = CreateFunction<Dictionary>(); var f3 = CreateFunction<SomeDerivedDictionaryType>(); 等等 根据@Andy的回答澄清 最后我想知道Tinheritance自/实现IDictionary即使T本身是Dictionary或从该接口派生的其他类型。 if(typeof(T) == typeof(IDictionary) 不起作用,因为T是generics类型而不是generics类型定义。 并且在不知道TKey和TValue (在编译时不知道)的情况下,我无法对运行时我知道的任何具体类型进行比较。 我唯一想到的就是查看类型的名称或者用reflection检查它的方法,寻找能让我相信它是字典的方法(即查找ContainsKey和get_Item )。 有没有直接的方法来做出这种决定?