Articles of generics

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 = […]

为通用列表创建排序函数

我有一个按对象字段排序通用列表的方法: public static IQueryable SortTable(IQueryable q, string sortfield, bool ascending) { var p = Expression.Parameter(typeof(T), “p”); if (typeof(T).GetProperty(sortfield).PropertyType == typeof(int?)) { var x = Expression.Lambda<Func>(Expression.Property(p, sortfield), p); if (ascending) q = q.OrderBy(x); else q = q.OrderByDescending(x); } else if (typeof(T).GetProperty(sortfield).PropertyType == typeof(int)) { var x = Expression.Lambda<Func>(Expression.Property(p, sortfield), p); if (ascending) q = q.OrderBy(x); else […]

在C#中,你可以将一个generics类型转换为另一个T参数是第一个T的子类吗?

我遇到了一个问题,我有一个generics,我正试图转换到另一个,其中第二个的genericsT参数是第一个中使用的子类。 这是我的代码,为了理解而简化… public partial class HierarchicalItem { public ObservableHierarchicalCollection ContainingCollection{ get; private set; } public HierarchicalItem Parent{ get{ return (ContainingCollection != null) ? ContainingCollection.Owner : null; }} } public partial class HierarchicalItem { public class ObservableHierarchicalCollection : ObservableCollection where T : HierarchicalItem { public ObservableHierarchicalCollection(HierarchicalItem owner) { this.Owner = owner; } public HierarchicalItem Owner{ get; […]

反映具有约束的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) ,我会得到上面的类型。

字符串的通用generics类型转换

我的任务是编写一个StringToType()方法,将字符串转换为指定的类型T. 对于基本类型,我使用Convert.ChangeType()方法 对于枚举类型 – Enum.TryParse() 对于所有其他自定义类型,我创建了一个接口“IConvertibleFromString”,其中包含一个方法“FromString()”,将字符串转换为指定的类型。 任何需要从字符串转换的类都必须实现此接口。 但我不喜欢我实现方法StringToType()的方式。 我想使用少于reflection并尽可能确保性能。 请告知如何最好地实施/更改它。 class Program { static bool StringToType(string str, ref T value) { Type typeT = typeof(T); bool isSuccess = false; if (typeT.GetInterface(“IConvertibleFromString”) != null) { return (bool)typeT.GetMethod(“FromString”).Invoke(value, new object[] { str }); } else if (typeT.IsEnum) { MethodInfo methodTryParse = typeT.GetMethod(“TryParse”).MakeGenericMethod(typeT); return (bool)methodTryParse.Invoke(null, new object[] { […]

具有generics类属性的LINQ表达式

我想将一个IQueryable和一组id传递给一个方法,该方法根据这些id过滤IQueryable。 由于id可以是long或int,因此应该通常解决。 我想出了以下内容: public static IEnumerable GetModified(IQueryable objects, TId[] ids) where T : class { return objects.Where(j => ids.Contains((TId)j.GetType().GetProperty(“Id”).GetValue(j))); } 不幸的是我得到了例外: LINQ to Entities无法识别方法’System.Object GetValue(System.Object)’方法,并且此方法无法转换为商店表达式。

C#中的通用类成员?

嘿,我想我在这里有错误的想法,但我不确定什么是最好的。 我想要一个具有成员变量的类,它可以是任何类型,具体取决于当时需要的内容。 到目前为止,我有这样的事情: public class ConfigSetting { private T value; public T GetValue() { return value; } public void ChangeValue() { } public ConfigSetting(string heading, string key) { this.value = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue; } } “this.value”行右侧返回的类型当前是一个字符串。 我知道这似乎我不需要使用除字符串类型之外的任何东西,但最终我将扩展构造函数,这样’this.value’可以是字符串,int,float或bool。 无论如何,我的编译器说“不能将’字符串’转换为’T’”,所以我假设我正在做一些非常倒退的事情。 谢谢。

实现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); […]

通用约束:强制类型具有静态函数和带参数的构造函数

我知道你可以写: class GenericClass where T : new() { } 强制执行T有一个空的构造函数。 我的Qs是: 你能强制说T有一个具有特定参数类型的构造函数吗? 喜欢: class SingletonFactoryWithEmptyConstructor where T : new(int) 你能强制执行T有一个静态函数(比方说, void F() ),这样你就可以在generics类中使用这个函数吗? 喜欢 : class GenericClass where T : void F() { void G () { TF(); } } 我知道你可以指定T实现一个接口,但我不希望这样。 我想指定T具有静态函数。

创建基于编译器的“字典”的非静态版本,其中键是类型

有一个非常简单的技巧,它创建了一个类似字典的结构,其中键是类型。 该结构的行为类似于Dictionary ,其中键是Type对象,值是相应类型的实例。 这个奇妙的结构和变量或数组一样快,因为“查找”只由编译器/ JITter执行一次,并且正确的值引用被编译到程序中。 public static class MyDict { public static T Value { get; set; } } 您可以像这样使用该结构: MyDict.Value = MyDict.Value.ToString(); 问题是这个“字典”是全球性的。 创建不同字典的唯一方法是创建不同的类。 如何创建一个类似的(最快的“查找”,没有拳击)非静态结构? (没有代码生成。) 简单地说:我希望有多个Dictionary类似的对象,没有查找成本,转换和装箱。