Articles of reflection

Automapper,generics,dto funtimes

这是交易: 我有一个报表设计器,用户可以根据某些预定义的数据集创建报表。 他们可以选择要包含在报表中的一组列,然后在运行报表时,通过使用automapper将NHibernate集合映射到dto类集合来创建IList。 这个问题是DTO集合有一堆冗余列,因为它将填充所有数据,无论是否需要它。 我的解决方案? 为什么不在运行时使用我们拥有的信息创建DTO类型,并仅使用所需的属性将nhibernate集合映射到动态创建的DTO集合: #region create a dto type: AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = “tmpAssembly”; var assemblyBuilder = System.Threading.Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); ModuleBuilder module = assemblyBuilder.DefineDynamicModule(“tmpModule”); // create a new type builder TypeBuilder typeBuilder = module.DefineType(“ReportDto”, TypeAttributes.Public | TypeAttributes.Class); foreach (var propertyName in propNames) { // Generate a private field FieldBuilder field = […]

使用reflection将XML转换为Object

如果你想解决问题,这里有一个很大的问题:D 首先,它不是关于序列化,好吗? 好吧,我的情况……我正在编写一个函数,我将作为参数传递给Xml(XmlDocument)和一个对象(Object)作为参考。 它将返回一个填充了Xml(XmlDocument)中的值的对象(被引用的对象)。 例如: 我有一个Xml像: 1 Daniel 我也有我的function public Object transformXmlToObject (XmlDocument xml, Object ref) { // Scroll each parameters in Xml and fill the object(ref) using reflection. return ref; } 我将如何使用它? 我会用这样的: [WebMethod] public XmlDocument RecebeLoteRPS(XmlDocument xml) { // class user receive the object converted from the function User user = new User(); […]

如何通过reflection区分值类型,可空值类型,枚举,可空枚举,引用类型?

如何通过reflection区分值类型,可空值类型,枚举,可空枚举,引用类型? enum MyEnum { One, Two, Three } class MyClass { public int IntegerProp { get; set; } public int? NullableIntegerProp { get; set; } public MyEnum EnumProp { get; set; } public MyEnum? NullableEnumProp { get; set; } public MyClass ReferenceProp { get; set; } } class Program { static void Main(string[] args) { […]

反映具有约束的generics类型的所有可能排列

给定具有约束的generics类型: class MyClass where T: Alpha { } 和约束的实现: class Alpha {} class Bravo : Alpha {} class Charlie : Alpha {} 如何在运行时获得所有组合的generics类型? // I want these types at run-time MyClass MyClass MyClass 编辑:根据@ rich.okelly的回答,我认为真正的问题是: 如何在运行时找到实现我的generics类型约束的所有类型? 所以,如果我给了typeof(MyClass) ,我会得到上面的类型。

从对象获取属性信息,而不将属性名称作为字符串

出于某些原因,我需要创建一个PropertyInfo实例的Dictionary,它对应于某些类的属性(让我们称之为EntityClass )。 好的,我可以使用typeof(EntityClass).GetProperties() 。 但我还需要确定某些特定属性的值(在编译时已知)。 通常我可以做以下其中一项: EntityInstance.PropertyX = Value; typeof(EntityClass).GetProperty(“PropertyX”).SetValue(EntityInstance, Value, null); 为了填满我的字典,我需要使用PropertyInfo实例而不是正常设置值。 但我觉得通过字符串名称获取属性并不舒服。 如果某些EntityClass发生更改,则会带来许多exception而不是编译错误。 所以,我要问的是: 如何在不传递字符串名称的情况下获取已知属性的PropertyInfo? 如果有像代表一样的话,我会很高兴: SomeDelegateType MyDelegate = EntityInstance.MethodX; 理想的情况是: SomePropertyDelegate MyPropertyDelegate = EntityInstance.PropertyX;

C# – 将’object’参数转换为该对象的类型?

C# 大家好, 我将一个对象传递给一个方法。 我想将该对象强制转换为特定的类,以便我可以执行自己的特定方法吗? 我怎样才能做到这一点? Move( new Cat() ); Move( new Pigeon() ); public void Move(object objectToMove) { if(objectToMove== Cat) { Cat catObject = objectToMove as Cat; catObject.Walk(); } else if(objectToMove== Pigeon) { Rat pigeonObject = objectToMove as Pigeon; pigeonObject.Fly(); } }

使用字符串值创建新实例

我有几个类:SomeClass1,SomeClass2。 如何使用字符串中的类名创建其中一个类的新实例? 通常,我会这样做: var someClass1 = new SomeClass1(); 如何从以下创建此实例: var className = “SomeClass1”; 我假设我应该使用Type.GetType()或其他东西,但我无法弄明白。 谢谢。

实现IEqualityComparer 以比较任何类的任意属性(包括匿名)

我正在编写实现IEqualityComparer的这个整洁的类,因此我可以将任何匿名类型传递给它(或实际上任何具有属性的类型),它将通过比较类型的属性值自动比较类型。 public class CompareProperty : IEqualityComparer { private Type type; private PropertyInfo propInfo; private string _fieldName; public string fieldName { get; set; } public CompareProperty(string fieldName) { this.fieldName = fieldName; } public bool Equals(T x, T y) { if (this.type == null) { type = x.GetType(); propInfo = type.GetProperty(fieldName); } object objX = propInfo.GetValue(x, null); […]

如何使用.Netreflection按名称忽略大小写来搜索属性?

我有以下代码行代码,它按名称搜索实例的属性: var prop = Backend.GetType().GetProperty(fieldName); 现在我想忽略fieldName的情况,所以我尝试了以下内容: var prop = Backend.GetType().GetProperty(fieldName, BindingFlags.IgnoreCase); … 没有骰子。 现在道具将找不到具有确切情况的字段名称。 因此…..我如何使用.Netreflection通过名称忽略大小写来搜索属性?

在C#中引用属性本身。 reflection? 通用? 类型?

如果这个问题没有很好地制定,请耐心等待。 不知道是问题的一部分。 我想要完成的一个例子可以在WPF中的PropertyChangedEventArgs中找到。 如果要在WPF中标记属性已更改,则执行以下操作: PropertyChanged(this, new PropertyChangedEventArgs(“propertyName”)); 您将字符串传递给PropertyChangedEventArgs,它引用已更改的属性名称 。 您可以想象我不希望在我的代码中使用硬编码字符串作为属性名称。 当然,重构重命名错过了它,这使得它不仅在美学上没有吸引力,而且还容易出错。 不管怎样,我更愿意参考房产本身 。 PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?)); 看起来我应该能够用一个简短的方法来包装它,让我说出类似上面的内容。 private void MyPropertyChanged(??) { PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??)); } … so I can say something like: MyPropertyChanged(Person.Name); //where I’m interested in the property *itself* 到目前为止,我正在画一个空白。