Tag: generics

用于公开通用接口的非generics版本的模式

假设我有以下界面来显示分页列表 public interface IPagedList { IEnumerable PageResults { get; } int CurrentPageIndex { get; } int TotalRecordCount { get; } int TotalPageCount { get; } int PageSize { get; } } 现在我想创建一个分页控件 public class PagedListPager { public PagedListPager(IPagedList list) { _list = list; } public void RenderPager() { for (int i = 1; i < […]

代码生成器或T4模板,它们真的很邪恶吗?

我听说人们说不应该使用代码生成器和T4模板。 这背后的逻辑是,如果您使用生成器生成代码,那么通过generics和模板构建代码有一种更好的更有效的方法。 虽然我略微同意上面的这个陈述,但我还没有真正找到有效的方法来构建模板,例如可以说实例化自己。 换句话说,我永远做不到: return new T(); 另外,如果我想基于数据库值生成代码,我发现将Microsoft.SqlServer.Management.SMO与T4模板结合使用可以很好地生成大量代码而无需复制/粘贴或使用resharper。 我在Generics中发现的许多问题都是令我震惊的是,有很多开发人员不了解它们。 当我为一个解决方案检查generics时,有时它会变得复杂,因为C#表明你不能做一些在我脑海里看似合乎逻辑的事情。 你的想法是什么? 你喜欢建造发电机,还是更喜欢使用仿制药? 此外,仿制药可以走多远? 我对generics有很多了解,但是我总是遇到陷阱和陷阱导致我使用T4模板。 处理需要大量灵活性的场景的更合适的方法是什么? 哦,作为这个问题的奖励,C#和Generics的优秀资源是什么?

使用reflection获取通用IDictionary的值

我有一个实现IDictionary的实例,我在编译时不知道T和K,并希望从中获取所有元素。 我不想出于某种原因使用IEnumerable ,这将是IDictionary实现的唯一非generics接口。 我到目前为止的代码: // getting types Type iDictType = instance.GetType().GetInterface(“IDictionary`2”); Type keyType = iDictType.GetGenericArguments()[0]; Type valueType = iDictType.GetGenericArguments()[1]; // getting the keys IEnumerable keys = (IEnumerable)dictType.GetProperty(“Keys”) .GetValue(instance, null); foreach (object key in keys) { // ==> this does not work: calling the [] operator object value = dictType.GetProperty(“Item”) .GetValue(instance, new object[] {key } ); […]

C#generics字符串解析为任何对象

我将对象值存储在字符串中,例如, string[] values = new string[] { “213.4”, “10”, “hello”, “MyValue”}; 有没有办法一般初始化适当的对象类型? 比如,像 double foo1 = AwesomeFunction(values[0]); int foo2 = AwesomeFunction(values[1]); string foo3 = AwesomeFunction(values[2]); MyEnum foo4 = AwesomeFunction(values[3]); 其中AwesomeFunction是我需要的function。 最终用途是初始化属性,例如, MyObject obj = new MyObject(); PropertyInfo info = typeof(MyObject).GetProperty(“SomeProperty”); info.SetValue(obj, AwesomeFunction(“20.53”), null); 我需要这样的function的原因是我将所述值存储在数据库中,并希望通过查询读出它们,然后初始化对象的相应属性。 这有可能吗? 整个对象没有存储在数据库中,只是我想要动态读取和设置的几个字段。 我知道我可以静态地完成它,但是这将变得乏味,难以维护,并且正在阅读具有许多不同字段/属性的容易出错的情况。 编辑:如果AwesomeFunction可以使用指定接受字符串的构造函数的自定义类,则AwesomeFunction奖励积分! EDIT2:在我要使用此类function的特定情况下,可以通过PropertyType了解目标类型。 我认为Enums很容易解析,例如, Type destinationType = info.PropertyType; Enum.Parse(destinationType, […]

如何使用两个generics类型参数声明一个Method?

是否可以为函数返回值执行不同的通用参数类型( U ),同时已经为本地参数设置了另一个通用参数类型? 我试过了: private static U someMethod (T type1, Stream s) 和 private static U someMethod (T type1, Stream s) 编辑:我们同意尝试: private static U someMethod (T type1, Stream s) public static T someMethodParent(Stream stream) { U something = someMethod(type1, stream); … }

关于C#generics的最重要的事情……经验教训

您对generics有哪些最重要的知识:隐藏的function,常见错误,最佳和最有用的实践,提示…… 我开始使用generics实现我的大部分库/ API,并希望收集在实践中发现的最常见的模式,提示等。 让我说一下这个问题:你对仿制药学到的最重要的事情是什么? 请尝试提供示例 – 与易于理解和过于干燥的描述相比,它更容易理解 谢谢 这个问题有点类似于Jon的问题 ,但是在另一个主题上。

如何编写一个函数来使用索引运算符获取任何对象

我想我过去在C ++(在我的问题历史记录中找不到它)的上下文中问过这个问题,解决方法是使用模板函数。 当C ++模板在编译时解析时,它可以工作。 但是对于C#,它没有。 public Hashtable ConvertToHashtable(T source) where T has an index operator { Hashtable table = new Hashtable(); table[“apple”] = source[“apple”]; return table; } 目前的一种用法是将OleDbReader中的结果转换为哈希表,但我预计很快就会需要更多源类型。

过度使用generics

当没有真正的好处是显而易见的时候,人们如何看待generics的使用。 下面是一个示例代码片段,类似于我正在处理的代码,我试图确定如果使用generics有什么好处。 public void DoSomething(Request request) { if (request == null) { throw new ArgumentNullException(“request”); } if (Request is ISomeInterface) { DoSomething(); } else { DoSomethingElse(); } } 你为什么不只使用Object?

如何在c#中使用generics,其中两个不相关的类具有相同的属性?

我正在尝试编写一个通用方法 GenericMethod(T item) where T : class { (if item.value1 == “something”) doSomething } 但是我收到一个错误: T does not contain the definition of value1. 我搜索了StackOverflow中的其他答案,并尝试实现一个接口,然后将方法定义更改为where T: dummyInterface 。 虽然这从方法中删除了错误,但在调用方法时出现错误: 我需要从两个不同的类中调用该方法: GenericMethod(customerRet)和GenericMethod(vendorRet) 。 GenericMethod(customerRet)抛出编译错误: accountRet should be convertible to dummyInterface 我也收到GenericMethod(vendorRet)相同错误。 customerRet和vendorRet没有任何关联 – 没有通用接口等。

从另一个窗口(Class)问题调用方法

在WPF应用程序主窗口的代码隐藏文件中,我有一个方法,使用LINQ to SQL查询数据库并将结果写入ObservableCollection: public void GetStateByDate(string shcode) { MydbDataContext contextSts = new MydbDataContext(); _ShAvaQuCollection.Clear(); var sts = from p in contextSts.SAties where p.ShID == shcode select p; foreach (var p in sts) _ShAvaQuCollection.Add(new ShAvaQu { ShCode = p.ShID, SiID = p.SiID, PrCat = p.PrCat }); } 当我从文件后面的相同代码(同一窗口)调用此方法时,一切正常。 如果我从另一个窗口调用此方法,使用主窗口的instanse,ObservableCollection仍为空: SWindow sw = new SWindow(); sw.GetStateByDate(stringpar); 这是什么原因? […]