32

我有一个非常大的对象,其中包含许多可为空类型的变量。我还有一本字典,我想用这个对象的非空变量填充它。

代码看起来像这样

if (myObject.whatever != null)
{
myDictionary.Add("...",myObject.whatever);
}
if (myObject.somethingElse != null)
{
myDictionary.Add("...",myObject.somethingElse);

...

编辑(抱歉弄乱了代码)

当我们无数次重复这一点时,我们会得到一堆非常长的代码。有没有更短的方法可以写出这个烂摊子?我知道条件运算符(又名?),但这只是用于分配。有没有类似的东西可以添加到收藏中?

4

4 回答 4

51

你的字典的扩展方法怎么样?

public static void AddIfNotNull<T,U>(this Dictionary<T,U> dic, T key, U value) 
where U : class {
    if (value != null) { dic.Add(key, value); }
}

然后你可以这样做:

myDictionary.AddIfNotNull("...",myObject.whatever);
于 2012-07-26T12:11:47.563 回答
7

我建议编写一个扩展方法:

public static class MyExtensions
{
    public static void AddIfNotNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
    {
        if ((object)value != null)
            dictionary.Add(key, value);
    }
}

Using(object)value != null确保这对可空类型(例如int?)值类型(例如int)和引用类型(例如SomeClass)如您所期望的那样工作。如果将其与 进行比较default(TValue),则不会添加intof ,即使它不为空。0如果您包含TValue : class需求,则不能Nullable<T>用作类型,这听起来像是您最常见的用法。

于 2012-07-26T12:16:55.167 回答
2

您可以制作一个隐藏您的方法if

AddIfNotNull(myDictionary, "...", myObject.whatever);

private static void AddIfNotNull<K,T>(
    IDictionary<K,T> myDictionary
,   K key
,   T value) {
    if (value != default(T)) {
        myDictionary.Add(key, value);
    }
}

您可以通过将该方法作为扩展来获得一些“风格积分”(然后您需要将其添加到静态类中):

private static void AddIfNotNull<K,T>(
    this IDictionary<K,T> myDictionary
,   K key
,   T value) {
    if (value != default(T)) {
        myDictionary.Add(key, value);
    }
}

myDictionary.AddIfNotNull(myDictionary, "...", myObject.whatever);

如果您知道您只插入引用类型对象,请替换default(T)为泛型null并添加一个class T约束。

于 2012-07-26T12:11:19.587 回答
0
public void addToDict(string ?myObj, Dictionary<,> myDict) {
        if (myObj != null)
              myDict.Add("...", myObj);
}

addToDict(myObject.whatever, myDict);
addToDict(myObject.somethignElse, myDict);

ETC

于 2012-07-26T12:12:04.487 回答