我正在做一些充满活力的A.I.编程并避免为每个用例创建这么多不同的类,以便参数可以正确传递,我以为我会使用一个对象包/容器,类似于字典。
为了完全支持它,我将密钥设置为Type参数,这样我就可以在其他项目中使用它,这样可以正常工作。我的问题是,我想支持对象和结构,所以在实现TryGet
样式函数时,我不知道如何分配out参数。
这是我的班级:
using System;
using System.Collections.Generic;
namespace mGuv.Collections
{
public class ObjectBag<TKey>
{
private Dictionary<Type, Dictionary<TKey, object>> _objects = new Dictionary<Type, Dictionary<TKey, object>>();
public ObjectBag()
{
}
private bool HasTypeContainer<T>()
{
return _objects.ContainsKey(typeof(T));
}
public bool HasKey<T>(TKey key)
{
if (HasTypeContainer<T>())
{
return _objects[typeof(T)].ContainsKey(key);
}
return false;
}
public void Add<TIn>(TKey key, TIn value)
{
if(!HasTypeContainer<TIn>())
{
_objects.Add(typeof(TIn), new Dictionary<TKey, object>());
}
_objects[typeof(TIn)].Add(key, value);
}
public bool TryGet<TOut>(TKey key, out TOut value)
{
if (HasKey<TOut>(key))
{
value = (TOut)_objects[typeof(TOut)][key];
return true;
}
// As expected, I can't assign value to null
value = null;
// I also can't just return false as value hasn't been assigned
return false;
}
}
}
无论如何都要为传入的任何内容的默认值赋值?
即。我希望能够做到:
ObjectBag<string> myBag = new ObjectBag();
myBag.Add<int>("testInt", 123);
myBag.Add<TestClass>("testClass", new TestClass();
myBag.TryGet<int>("testInt", out someInt);
myBad.TryGet<TestClass>("testClass", out someTestClass);
我不想使用ref,因为这需要在传递变量之前初始化变量。
答案 0 :(得分:0)
没关系,我认为default
仅适用于结构/值类型。
我可以这样做:
value = default(TOut);
在提出问题之前我应该更多地研究一下。我会留下它,以防其他人像我一样傻。