簡體   English   中英

不可為空類型的通用 throw 函數

[英]Generic throw function for non-nullable types

我試圖在初始化期間使用不可為空的屬性將現有項目轉換為使用可空引用類型屬性。

我正在使用這種方法來獲取應該存在的屬性:

public class Dog
{
    private Person? _person;
    public int Id { get; set; }

    public string Name { get; set; }

    public Person Person
    {
        get => _person ?? throw new InvalidOperationException(
            $"Unset property {nameof(_person)}. You probably forgot to Include it");
        set => _person = value;
    }
}

但是為幾乎每個屬性都寫這個很乏味,所以我試圖制作一個通用的ThrowOrGet()函數:

public static class Util
{
    public static T ThrowOrGet<T>([AllowNull] T obj)
    {
        if (obj == null)
        {
            throw new InvalidOperationException(
                $"Unset property {nameof(obj)}. You probably forgot to Include it");
        }
        return obj;
    }
}

這是這樣使用的:

public class Dog
{
    private Person? _person;
    public int Id { get; set; }

    public string Name { get; set; }

    public Person Person
    {
        get =>  Util.ThrowOrGet(_person); ---> "Possible null reference return"
        set => _person = value;
    }
}

但是函數Util.ThrowOrGet(_person); 現在說這是一個可能的null引用返回。 如果我內聯該函數,它將按預期工作。 有沒有辦法制作一個通用函數來做到這一點?

如果你只打算在引用類型上使用ThrowOrGet (你應該這樣做,因為它對值類型沒有意義),那么你應該像這樣聲明它:

public static T ThrowOrGet<T>(T? obj) where T : class
{
    if (obj == null)
    {
        throw new InvalidOperationException(
            $"Unset property {nameof(obj)}. You probably forgot to Include it");
    }
    return obj;
}

這表示該函數接受一個可為空的參數,並始終返回一個不可為空的引用。 遵循此模式比依賴屬性更好,因為它們實際上只用於復雜情況,而事實並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM