我正在尝试做这样的事情
public void GetData(ref Dictionary<T,V> dataDictionary)
{
}
其中T可以是GUID,string或int,V是自定义用户或项目对象。
答案 0 :(得分:2)
为什么您希望能够更改来电者参考?为什么不是
public Dictionary<T,V> GetData<T,V>()
足够好吗?
在基于ref的世界中:
public void GetData<T,V>(ref Dictionary<T,V> dictionary)
编辑:并非我以任何方式宽恕以下内容,但......
如果你需要关心T可以使用的不同类型,你可以像创建任何覆盖方法一样创建泛型覆盖。
// client code
Dictionary<int, object> x = null;
GetData(ref x);
Dictionary<string, Guid> y = null;
GetData(ref y);
泛型覆盖:
public void GetData<V>(ref Dictionary<int, V> dictionary)
{
dictionary = new Dictionary<int,V>(); // reassign reference.
}
public void GetData<V>(ref Dictionary<string, V> dictionary) { ... }
public void GetData<V>(ref Dictionary<Guid, V> dictionary) { ... }
虽然语义相同,但由于含糊不清,因此返回值无法进行以下覆盖。
public Dictionary<int, T> ReturnData<T>() { ... }
public Dictionary<string, T> ReturnData<T>() { ... }
错误CS0111:类型'测试'已经定义了一个名为'ReturnData'的成员,其参数类型相同
你可以通过传入和传出对象来解决这种模糊性,但同样看起来很可怕:
public Dictionary<int, T> ReturnData<T>(Dictionary<int, T> self) { ... }
public Dictionary<string, T> ReturnData<T>(Dictionary<string, T> self) { ... }
答案 1 :(得分:0)
这有帮助吗?任何其他信息都会有所帮助。
public void GetData<T, V>(ref Dictionary<T, V> dataDictionary) {
if (typeof(T) == typeof(string) || typeof(T) == typeof(int) || typeof(T) == typeof(Guid)) {
...
} else {
throw new ArgumentException();
}
}
答案 2 :(得分:0)
这里的目标是什么?你提到string
/ Guid
等只是例子,所以我认为我们不需要关注那些......
如果你只是想能够操纵字典内容,那么“完成” - 已经有效了。由于Dictionary<,>
是引用类型,因此调用者已经看到您所做的任何更改。您也可以删除ref
...
public void GetData(Dictionary<T,V> dataDictionary) // or IDictionary<T,V>
{
T key = GetSomeKey();
V value = dataDictionary[key]; // query
dataDictionary.Remove(key); // mutate
}