C# 泛型字典作为ref方法参数

C# 泛型字典作为ref方法参数,c#,C#,我正试着做这样的事情 public void GetData(ref Dictionary<T,V> dataDictionary) { } public void GetData(ref Dictionary dataDictionary) { } 其中T可以是GUID、string或int,V是自定义用户或项目对象。这有帮助吗?任何其他信息都会有帮助 public void GetData<T, V>(ref Dictionary<T, V> da

我正试着做这样的事情

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


}
public void GetData(ref Dictionary dataDictionary)
{
}

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

这有帮助吗?任何其他信息都会有帮助

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();
    }
}
public void GetData(ref Dictionary dataDictionary){
if(typeof(T)=typeof(string)| | typeof(T)==typeof(int)| | typeof(T)==typeof(Guid)){
...
}否则{
抛出新ArgumentException();
}
}

为什么您希望能够更改呼叫者引用?为什么不呢

public Dictionary<T,V> GetData<T,V>()
公共字典GetData() 够好吗

在基于ref的世界中:

public void GetData<T,V>(ref Dictionary<T,V> dictionary)
public void GetData(参考字典)

编辑:并不是说我在任何方面都宽恕以下行为,但是

如果您需要关心T可以是的不同类型,那么可以使用创建任何重写方法的相同方式创建泛型重写

// client code
Dictionary<int, object> x = null;
GetData(ref x);

Dictionary<string, Guid> y = null;
GetData(ref y);
//客户端代码
字典x=null;
GetData(参考文献x);
字典y=null;
GetData(参考文献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 void GetData(参考字典)
{
dictionary=newdictionary();//重新分配引用。
}
public void GetData(ref Dictionary Dictionary){…}
public void GetData(ref Dictionary Dictionary){…}
虽然语义相同,但由于不明确,返回值不可能有以下覆盖

public Dictionary<int, T> ReturnData<T>() { ... }
public Dictionary<string, T> ReturnData<T>() { ... }
public Dictionary ReturnData(){…}
公共字典ReturnData(){…}
错误CS0111:类型“Testing”已使用相同的参数类型定义了名为“ReturnData”的成员

您可以通过将对象传入和传出来避免歧义,但这同样可怕:

public Dictionary<int, T> ReturnData<T>(Dictionary<int, T> self) { ... }
public Dictionary<string, T> ReturnData<T>(Dictionary<string, T> self) { ... }
public Dictionary ReturnData(Dictionary self){…}
公共字典返回数据(字典自身){…}

这里的目标是什么?您提到的
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
}
public void GetData(Dictionary dataDictionary)//或IDictionary
{
T key=GetSomeKey();
V value=dataDictionary[key];//查询
dataDictionary.Remove(key);//mutate
}

好吧,您不能将t限制为仅为Guid、string或int,但除此之外,它应该可以工作。Jon,我不想把它限制为GUID、string、int,但我只是举了这些类型的例子。顺便说一句,你的博客的忠实粉丝很高兴你喜欢这个博客:)但这里的实际问题是什么?我同意罗伯特的观点——你几乎肯定不想使用ref。既然你提到了,使用ref关键字可能是个坏主意。我想我不应该在深夜编写别人的代码