通用字典作为ref方法参数

时间:2008-11-12 02:34:06

标签: c#

我正在尝试做这样的事情

public void GetData(ref Dictionary<T,V> dataDictionary)
{


}

其中T可以是GUID,string或int,V是自定义用户或项目对象。

3 个答案:

答案 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
}