gpt4 book ai didi

c# - 除非完全必要,否则有什么方法可以防止两个程序集之间的依赖关系从第三个程序集变为 "seen"?

转载 作者:行者123 更新时间:2023-11-30 22:37:21 25 4
gpt4 key购买 nike

在我进行大量元编程的库的深处,有一个包含以下代码的类:

// Initialized in the constructor
// Destroyed in IDisposable.Dispose
private IDataReader reader;

private T Retrieve<T>()
where T : class, new() {

if (!this.reader.Read())
return null;

// This does the same as typeof(T).GetProperties(), but ReflectionHelper
// memoizes the properties of the types passed to GetProperties.
PropertyInfo[] properties = ReflectionHelper.GetProperties(typeof(T));

T result = new T();
foreach (PropertyInfo property in properties)
property.SetValue(result, this.reader[property.Name], null);
return result;
}

public T RetrieveObject() {
T result = this.RetrieveObject<T>();
this.reader.NextResult();
return result;
}

public List<T> RetrieveList<T>()
where T : class, new() {

List<T> result = new List<T>();
for (T element; (element = this.Retrieve<T>(reader)) != null; )
result.Add(element);
this.reader.NextResult();
return result;
}

不用说,这个类是IDbConnection 的包装器, IDbCommandIDataReader ,还有允许理智访问结果的额外好处。

我想在类中添加以下方法:

public T RetrieveCompound<T, U>()
where T : class, IHeader<U>, new()
where U : class, new() {

T header = this.RetrieveObject<T>();
if (header != null)
header.Details = this.RetrieveList<U>();
return header;
}

public T RetrieveCompound<T, U, V>()
where T : class, IHeader<U>, IHeader<V>, new()
where U : class, new() {

T header = this.RetrieveObject<T>();
if (header != null) {
((IHeader<U>)header).Details = this.RetrieveList<U>();
((IHeader<V>)header).Details = this.RetrieveList<V>();
}
return header;
}

public T RetrieveCompound<T, U, V, W>()
where T : class, IHeader<U>, IHeader<V>, IHeader<W>, new()
where U : class, new() {

T header = this.RetrieveObject<T>();
if (header != null) {
((IHeader<U>)header).Details = this.RetrieveList<U>();
((IHeader<V>)header).Details = this.RetrieveList<V>();
((IHeader<W>)header).Details = this.RetrieveList<W>();
}
return header;
}

但是,这有一个非常重要的陷阱:接口(interface) IHeader<T>恰好在不同的程序集中声明,我不想强​​迫 IDataReader 的用户- 包装类以添加对他们可能不需要的程序集的引用。

我知道我可以使用扩展方法解决这个问题,但我使用的是 .NET Framework 2.0。有没有其他方法可以解决这个问题?

最佳答案

您可以将这些方法添加到派生类型。这样,如果你不需要 IHeader<T> - 相关功能,您不需要引用程序集。

关于c# - 除非完全必要,否则有什么方法可以防止两个程序集之间的依赖关系从第三个程序集变为 "seen"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com