Tag: generics

C#generics问题

我试图从一本关于generics的书中完成一个练习题,但这个问题对我来说没有意义。 在这里。 创建两个具有相同function的类。 对第一个类使用generics,并将第二个类强制转换为对象类型。 创建一个使用类和基于对象的类的for循环来确定哪个表现更好。 我不确定通过转换为Object类型意味着什么。 到目前为止,这是我的代码 //Generic class Person { T var1; public Person(T yer) { var1 = yer; } public T Value { get { return var1; } } } //Normal class class Human { int var1; public Human(int yer) { var1 = yer; } public int Value { get { return var1; […]

在generics类中为静态方法设置无类型

不是Java的粉丝,但Java不允许为generics类设置类型,在这种情况下,它会将类型威胁为Object类型。 但是,据我所知,C#强制设置的类型,只要通用类必须实例化或简单地使用。 但是,假设我们有一个generics类,我们需要一个静态方法,它不依赖于的类型。 首先,我们知道它可以移动到一个单独的上下文,或者我们可以设置一个虚拟类型的 ,但是作为一个编程难题,有没有办法调用它而不定义T的类型 ? 例: class Test where T: ITestable { … public static void CreateTestFile(String fileName) {…} } Test.CreateTestFile(“test.txt”); 这可以用Java完成,显然不能用C#。 但我只是想确定一下。

C#genericsinheritance和协方差

我正在构建一个集合库,我希望所有通用集合接口都需要类类型,并且所有实现它们的集合都是任何类型。 所以在值类型上,集合将有两个方法,一个用于值类型,另一个用于装箱。 这可能吗? 像这样: interface ICollection where ItemType : class { void DoSomething(ItemType item); } class Collection : ICollection { void DoSomething(Object item); void DoSomething(ItemType item); } 除非最好的解决方法是什么? 接口是非通用的?

在LINQ结果上将IEnumberable 转换为List ,导致巨大的性能损失

在LINQ结果上你喜欢这样: var result = from x in Items select x; List list = result.ToList(); 但是, ToList真的很慢,是否会使列表变得可变,因此转换速度很慢? 在大多数情况下,我可以设法让我的IEnumerable或Paralell.DistinctQuery但现在我想将项目绑定到DataGridView,因此我需要作为其他东西而不是IEnumerable ,关于如何获得ToList或任何性能的建议替换? 在IEnumerable中的10个百万记录中, .ToList大约需要6秒钟。

使用reflection实例化generics类

[ 注意:我不相信这个问题与上面链接的问题重复,正如我在下面的更新中解释的那样。] 有没有办法使用reflection定义/实例化generics类? 所以我有一堆类,每个类都拥有一个generics类的实例,它共享其所有者的类型: public class GenericClass { T Owner { get; set; } public GenericClass(T owner) { Owner = owner; } } public class MyClass { private GenericClass myGenericObject; public MyClass() { myGenericObject = new GenericClass(this); } } 这有效,但当然我必须明确指定“MyClass”作为GenericClass定义中的参数。 我希望能够做到这样的事情: private GenericClass myGenericObject; // Error: invalid token 无论如何,在编译时根据包含的类动态指定generics对象的类型? 更新:在阅读了这些 问题的答案之后,我了解到我可以像这样实例化一个局部变量: var myGenericObject = Activator.CreateInstance(typeof(GenericClass).MakeGenericType(this.GetType())); […]

数学和generics

好的,我需要实现这两种特殊类型: ComplexNumber和Matrix 。 T可以是以下之一: 有理数 , 实数或整数。 在System命名空间中,我对实数( decimal ),整数( int或long )有很好的表示。 Numerics.ComplexNumber不会削减它,因为内部RealPart和ImaginaryPart是double ,在这种特殊情况下,我不能承受这种类型的表示错误。 现在,探测器当然是没有办法将通用参数T约束到数学“有效”类型。 也就是说,我不能做到以下几点: public struct ComplexNumber { readonly T realPart; readonly T imaginaryPart; public static ComplexNumber Add(ComplexNumber left, ComplexNumber right) { return new ComplexNumber(left.realPart + right.realPart, left.imaginaryPart + right.imaginaryPart); //Compile time error. No operator defined for T } } 所以我需要一个解决方法。 虽然性能本身并不是目标,但我希望代码能够合理地运行,但最重要的是,我希望它能成为最优雅的解决方案。 现在我想出了两种可能性: […]

将类型T的generics属性转换为已知的inheritance类型

我收到以下编译器错误 无法将类型’T’转换为’ProjectReportingHandler’ 为线 var projectReport = (ProjectReportingHandler)result.Report; 在尝试编译时: public abstract class ReportingHandler { // Report stuff } public abstract class ProjectReportingHandler: ReportingHandler { // Report stuff // Project specific report stuff } public class ReportInstance where T : ReportingHandler { public T Report { get; private set; } } public class ReportLibraryEntry where T : […]

通用方法中的Cast接口

我是界面的新用户。 我的问题是我创建了一个Generic类,它有两个参数,一个是对象类型,另一个是接口类型。 现在在类中我可以使用Reflection来转换对象,但我没有获得构建接口的方法。

使用不同类型的args在Func之间转换

是否有内置的方法在各种类型的Func代理之间进行转换? 也就是说,假设您需要一个Func,但是您有一个Func(并且您具有应该传入T参数的值)。 例如: static TREsult Foo(Func f) { // … TResult result = f(); // … return result; } static int MyFunc(int i) { return i; } void CallFoo() { Func func = ConvertFunc(MyFunc, 1); // Does this family of methods exist? int j = Foo(func); } 我写了自己的,像这样: static Func ConvertFunc(Func f1, T t) { […]

如何比较通用参数类型?

我有一个包含generics类的类: class MyClass { } T类型可以是任何类型,包括MyClass 。 是的,这有点递归,可以有像MyClass<MyClass<MyClass>> 。 在某些时候,在MyClass中,我想知道T是MyClass还是从MyClass派生的任何类型。 (无论AnyOtherType是什么,只需要知道T是否是MyClass)。 那么,我如何将T类型与MyClass进行比较? 我想出的另一件事是,为了避免参数问题,我要让MyClassinheritanceMyClass (没有参数),以便比较更容易。 class MyClass : MyClass 但问题仍然存在: How can I compare T with MyClass to know if it’s some type that inherits MyClass??