Tag: generics

通用的多层数据访问模式?

我一直在玩一些用于n层数据访问的新模式,并且遇到了一个看起来非常灵活且易于实现的模式。 基本上,我需要一个可以在运行中使各种数据层可插拔/交换的解决方案 – 即从DB进行基本数据访问,分布式缓存,本地缓存等。 下面的代码很容易重复使用并且效率极高 – 只比我以前完全硬编码的解决方案长几个小时。 这看起来怎么样? 有没有什么办法可以更好地实施? 任何一般的想法或批评? 那些使用类似模式的人的任何输入? 基类: public class DataAdapterFactory where T : class { private DataAdapter Adapter; public DataAdapterFactory(DataAdapterBase Base) { Adapter = Base; } public void Extend() where U : DataAdapterExtender, T, new() { DataAdapterExtender Extender = new U(); Extender.BaseAdapter = Adapter as T; Adapter = Extender; } […]

如何避免使用第三方Web服务重复代码 – 不使用动态?

我正在使用第三方Web服务,其中所有方法都具有以下签名: SomeResponseClass SomeMethod(SomeRequestClass request) 每个方法都有自己的请求类和它自己的响应类。然而,所有请求都有一些共同点,并且所有响应都有共同点。 每个请求类都有一些用于标识的属性: username和token ,每个响应类都有一些属性来指示是否存在错误: status和error 。 我正在寻找一种优雅的方法来创建一个实例化我的请求的方法 – 这样我就不必在调用服务的每个方法中重复自己。 由于我无法更改类,并且没有所有类的通用接口或基类,我找到的唯一解决方案是使用dynamic : private T CreateRequest() where T : new() { if(string.IsNullOrEmpty(_Token)) { Login(); } // this has to be dynamic for the next 2 rows to pass compilation. dynamic request = new T(); request.username = _UserName; request.token = _Token; return (T)request; } […]

generics和entity framework:如何根据列值返回不同的类型

我们有一个人员表,存储不同类型的人(买方,卖方,代理等)。 我们的ORM是entity frameworkCodeFirst(CTP5)。 我们正在使用存储库模式进行良好的TDD和模拟。 在PersonRepository中我想返回一个特定的类型,所以我可以做这样的事情: Agent a = repository.Get(5005); // Where 5005 is just an example Id for the person a.SomeAgentProperty = someValue; Buyer b = repository.Get(253); // Again, a simple PersonId. b.SomeBuyerProperty = someOtherValue; 我的想法是,当我从存储库中获取它时,我知道我会得到什么样的人。 而且,是的,我可以创建X个不同的Get方法,称为GetBuyer(int PersonId),GetSeller(int PersonId)等等。 但那有代码味道。 generics函数看起来如何? 到目前为止,这是我的存储库界面: public interface IPersonRepository { Person Get(int PersonId); // To get a generic person […]

C#generics类使用引用类型和可空值类型

我有一个有趣的问题。 我想创建一个可以处理Reference类型和Nullable类型的generics类。 基本上我想要的东西: public class ClassWithNull { public T varName = null; } 当然,这当然不会编译,因为并非所有类型都可以赋值为null,即不可为空的值类型。 但问题是Nullable是一个值类型,所以简单地添加where T : class对我没有帮助。 我的genericsfoo不是太强,但是我无法找到任何方式来说T必须是引用类型或可以为值的类型。 我必须解决的想法是使ClassWithNull成为一个抽象类。 然后我可以添加两个子类,一个用于处理引用类型,另一个用于处理可空值类型。 然后,基类中的静态工厂方法可以使用reflection来确定应该构造哪个子类。 就像是: public static ClassWithNull CreateClassWithNull() { StackTrace st = new StackTrace(); Type type = st.GetFrame(1).GetMethod().GetGenericArguments()[0]; if (!type.IsValueType) { return new ClassWithReferenceType(); } else if (type == typeof(Nullable)) { return new ClassWithNullableValueType(); } else […]

C#Generic List转换为实现List 的类

以下代码产生该问题 无法将类型’System.Collections.Generic.IEnumberable<DataField>’隐式转换为’DataFields’。 存在显式转换(您是否错过了演员?)。 我该如何解决这个问题? 我究竟做错了什么? public class DataFields : List { } public abstract class DataField { public string Name { get; set; } } public class DataField : DataField { public T Value { get; set; } } public static DataFields ConvertXML(XMLDocument data) { DataFields result = (from d in XDocument.Parse(data.OuterXML).Elements() select new DataField […]

generics类的协方差

在C#中有什么方法可以实现以下目的: class MyClass where T : BaseTypeInner {} class BaseTypeInner {} class A : BaseTypeInner {} class B : BaseTypeInner {} void Main() { MyClass variant; variant = new MyClass (); // ERROR: Cannot implicitly convert type ‘UserQuery.MyClass’ to ‘UserQuery.MyClass’ variant = new MyClass (); }

Castle Windsor解析通用界面

我有一些实现的通用接口。 interface IBaseInterface { TDetails GetDetails(TObject obj); } abstract class BaseImpl : IBaseInterface { public abstract string GetDetails(TObject obj); } class Impl0 : BaseImpl { public override string GetDetails(decimal obj) { return “decimal”; } } class Impl1 : BaseImpl { public override string GetDetails(string obj) { return “string”; } } class Impl2 : BaseImpl { […]

使用配置文件中的字符串来初始化generics类型

我上课了: public class MyClass 我有一个我正在阅读的配置文件,比如说,类型为T Guid 。 我怎么做,除了使用配置文件中的字符串而不是实际类型(而不是硬编码Guid )? MyClass = new MyClass();

在C#中Foreach结构奇怪的编译错误

namespace MyNamespace { public struct MyStruct { public string MyString; public int MyInt; public bool MyBool; } public class MyClass { private List MyPrivateVariable; public List MyVariable { get { if (MyPrivateVariable == null) { MyPrivateVariable = new List(); MyPrivateVariable.Add(new MyStruct()); MyPrivateVariable.Add(new MyStruct()); } return MyPrivateVariable; } } public void MyLoop() { foreach (MyStruct ms […]

C#:可以返回新添加对象的排序位置的通用排序容器?

我需要一个通用容器来保持其元素排序,并且可以询问它将插入新元素的位置(在哪个位置),而不实际插入它。 这样的容器是否存在于.NET库中? 最好的例子是一个例子(容器按ASCII值对字符进行排序,假设unicode不存在): sortedContainer.Add(‘d’); sortedContainer.Add(‘b’); sortedContainer.Add(‘g’); //container contains elements ordered like ‘b’ ‘d’ ‘g’ //index ——————————–> 0 1 2 sortedContainer.GetSortedIndex(‘a’); //returns 0 sortedContainer.GetSortedIndex(‘b’); //returns 0 sortedContainer.GetSortedIndex(‘c’); //returns 1 sortedContainer.GetSortedIndex(‘d’); //returns 1 sortedContainer.GetSortedIndex(‘e’); //returns 2 sortedContainer.GetSortedIndex(‘f’); //returns 2 sortedContainer.GetSortedIndex(‘g’); //returns 2 sortedContainer.GetSortedIndex(‘h’); //returns 3 […] 搜索位置应该利用元素排序的事实。