Tag: generics

如何访问generics类型的静态方法

public class BusinessObjects where O : BusinessObject { void SomeMethod() { var s = O.MyStaticMethod(); // <- How to do this? } } public class BusinessObject { public static string MyStaticMethod() { return "blah"; } } 是否有正确的面向对象的方法来实现这一点,还是我需要求助于反思? 编辑:我试图过于简单化这个问题,并且遗漏了一个重点。 MyStaticMethod使用reflection并需要派生类型来返回正确的结果。 但是,我刚刚意识到我设计中的另一个缺陷是我无法使用静态虚拟方法,我认为这就是我需要的。 看起来我需要找到另一种解决这个问题的方法。

在这种情况下,C#generics是否会阻止结构的自动装箱?

通常,将结构S视为接口I将触发结构的自动装箱,如果经常这样做会对性能产生影响。 但是,如果我使用类型参数T : I I编写一个generics方法并用S调用它,那么编译器是否会省略装箱,因为它知道类型S并且不必使用接口? 这段代码显示了我的观点: interface I{ void foo(); } struct S : I { public void foo() { /* do something */ } } class Y { void doFoo(I i){ i.foo(); } void doFooGeneric(T t) where T : I { t.foo(); // <— Will an S be boxed here?? } public static void […]

什么是类型参数命名准则?

我注意到,除了在Essential C#3.0书中看到,参数通常被定义为T或TEntity 例如: public class Stack { } 要么 public class EntityCollection { } 你如何决定使用哪个名字? 谢谢

方法重载只有通用约束才有区别

我遇到了一个问题,我根本无法找到一个好的解决办法。 我想要这3个重载: public IList GetList(string query) where T: string public IList GetList(string query) where T: SomeClass public IList GetList(string query) where T: struct 显然第一个约束甚至不会单独编译,所以这是我的第一个问题。 (我意识到我可以让它成为IList但我想要三个相同的语法) 无论如何,所有这些的原因,是这些方法是围绕对数据库执行SQL查询的包装器的一部分 – 我希望能够将结果作为字符串列表返回(如果有人选择了varchar列),列表valuetypes(int,float,whatever)或类列表(这些类表示表,因此包含多个列) 我希望这部分有点可以理解:-) 无论如何,我的大问题显然是我无法进行这些重载,因为它们使用相同的名称和参数列表。 我也不能将它们合并到同一个方法中,因为我需要在该实现中调用SomeClass上的方法,所以除非我想做一些重型类型转换,或者更糟糕的是reflection – 我需要这个约束。 我意识到我正在努力做的事情是不可能的,所以我正在寻找的是一种很好的方法,它会模仿我的意图。 如果其中一些有点不清楚,请随意问:-) 编辑: 这是我当前的“where T:SomeClass”版本的代码。 我正在尝试添加对当前代码的字符串/值类型的支持,所以也许我最初的方法是完全错误的 – 基本上欢迎任何想法:-) public IList GetList(string query) where TValue : DbTable, new() { DataSet dataSet = GetDataSet(query); […]

generics方法用法

我在C#中有这个代码: private static T GetPage() where T : new() { var page = new T(); PageFactory.InitElements(Browser.Driver, page); return page; } public static AboutPage About { get { return GetPage(); } } 我试图在Java中实现这一点,因为我非常喜欢这个概念,但我对generics(尤其是c#)并不擅长。 那么,这是我的代码: private static T getPage(Class cls) throws Exception{ T page = cls.newInstance(); PageFactory.initElements(driver, page); return page; } public static LoginPage Login() { return […]

“T @this”在委托声明中的含义是什么?

我刚刚使用Dustin Campbell的WeakEvent类为项目添加了一个弱事件实现。 虽然盲目地使用Code I Found On The Internet™通常是一个坏主意,但它的实现要比我以前一起攻击的好得多。 到目前为止它似乎运行良好,但为了理解代码我遇到了以下情况: public class WeakEventHandler : IWeakEventHandler where T : class where E : EventArgs { private delegate void OpenEventHandler(T @this, object sender, E e); … 我习惯用object sender和EventArgs args参数声明委托类型,那么这个部分实现的是什么? 显然它是在宣告WeakEventHandler的Tgenerics类型,但我以前从未见过@this (并且谷歌搜索它是可以理解的绝望)。

使用as关键字对C#中的generics类型进行编译时行为冲突

尝试对无法转换的非generics类型使用C#“as”关键字时,编译器会提供无法转换类型的错误。 但是,当对generics类型使用“as”关键字时,编译器不会给出错误: public class Foo { } public class Bar { } public class Usage { public void Test() { EventArgs args = new EventArgs(); var foo = args as Foo; // Compiler Error: cannot convert type var bar = args as Bar; // No compiler error } } 我在更大的代码库中发现了这种行为,其中缺少编译时错误导致运行时出现问题。 设计是否存在冲突行为? 如果是这样,有没有人知道为什么?

非generics类中的generics方法?

我确定我以前做过这个,但找不到任何例子! 哎呀… 例如,我想将IList转换为BindingList : public class ListHelper { public static BindingList ToBindingList(IList data) { BindingList output = new BindingList(); foreach (T item in data) output.Add(item); return output; } }

使用企业库的ExecuteSprocAccessor方法和generics

我试图通过使用带有generics的.NET Enterprise Library的ExecuteSprocAccessor方法,使用一个类来处理数据库上的所有CRUD。 在我的数据层中,我尝试这样的事情: public static class CRUDDatabase { private static Database db = DatabaseFactory.CreateDatabase(“ITS”); public static T SelectSingle(string sprocName, int id) { return db.ExecuteSprocAccessor(sprocName, id).First(); } } 但是,我在SelectSingle()方法的返回行上得到一个构建错误,指出: ‘T’必须是具有公共无参数构造函数的非抽象类型,才能在generics类型或方法’Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor(Microsoft.Practices.EnterpriseLibrary)中将其用作参数’TResult’。 Data.Database,string,params object [])’ SelectSingle()方法背后的想法是从数据库传入所需对象的存储过程名称和记录ID。 最终我会有SelectAll(),Update(),Delete()等。这些方法中的参数会有所不同,但你会明白我想要完成的任务。 在阅读了这个错误之后,我开始认为这可能是不可能的,但有人知道这是否可行? 此外,我的数据库中的字段与我的类中的字段匹配1:1,这就是为什么我没有指定任何映射器。 谢谢

检查结构的默认值

我的DefaultValue()函数有问题。 它总是返回false ,表示结构不是默认值。 为什么这不起作用? [StructLayout(LayoutKind.Sequential)] private struct ArrayItem { public long SrcSize; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)] public string SrcFile; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)] public string DestFile; } [StructLayout(LayoutKind.Sequential)] private struct MyInfo { public int Count; public int AppOne; public int AppTwo; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100, ArraySubType = UnmanagedType.Struct)] public ArrayItem[] Files; } private bool DefaultValue(T […]