簡體   English   中英

返回ID的一般功能

[英]General function to return Id

在我的項目中,我編寫了自己的映射器,在很多地方我都在做類似tbl.Type != null ? tbl.Type.Id : 0事情tbl.Type != null ? tbl.Type.Id : 0 tbl.Type != null ? tbl.Type.Id : 0返回引用對象的ID。 由於這種情況發生了很多次,因此無論我傳遞的對象類型如何,我都試圖創建一個小的函數來為我執行此檢查。

我一直在思考

public static int returnId(object input)
{
    if(input != null && input.Id != null)
    {
        return input.Id;
    }
    return 0;
}

或使用通用類型<T>

當前,此函數引發錯誤,因為object不包含.Id的定義。 我已經搜尋了幾個小時,開始懷疑我在尋找什么甚至可能。

歡迎任何幫助和想法,並深表感謝!

所有輸入都應實現IId接口:

public static int returnId(IId input)
{
    if(input != null && input.Id != null)
    {
        return input.Id;
    }
    return 0;
}

或通過反射:

public static int returnId(object input)
{        
    if(input != null)
    {
        var Id = input.GetType().GetProperty("Id").GetValue(input);
        if(Id != null)
            return ((int?)Id).Value;
    }
    return 0;
}

您有兩種選擇:

1:使用dynamic代替object

public static int returnId(dynamic input)
{
    if(input != null && input.Id != null)
    {
        return input.Id;
    }
    return 0;
}

2:讓所有類都從定義id的接口繼承:

public static int returnId(IId input)
{
    if(input != null && input.Id != null)
    {
        return input.Id;
    }
    return 0;
}

public interface IId
{
   int Id {get; set;}
}

第二個選項應該具有更好的性能,因為動態要求在運行時解析操作。

在一般情況下,您嘗試執行的操作不可行。 如果希望能夠檢索對象的ID,則需要確保在將與方法一起使用的每種類型中都存在屬性ID。

在大多數情況下,最好的選擇是遵循Slava的原始建議,即(稍作增強)

public interface IId
{
    int Id {get;}
}

public static int returnId<T>(T input) where T : IId
{
    return input != null ? input.Id : 0;
}

使用動態和反射(例如,input.GetType()。GetProperty(“ Id”)。GetValue(input))會產生相似的效果,但是1)它不提供編譯時保證-所有驗證均在運行時完成,並且將失敗如果類型沒有名為“ Id”的屬性; 2)運行時邏輯會對性能產生負面影響,這在頻繁使用時可見。

只有當您只需要將此方法應用於自己定義的類型(而不是任何第三方類)時,@ hofmeister建議的繼承是一個選項。

您可以使用繼承並為您的每個類實現Id屬性。 像這樣:

public abstract class ObjectId
{
    // Or as auto-propert `public virtual int Id { get; private set; }`.
    public abstract int Id { get; }
}

public class ObjectImpl : ObjectId
{
    public override int Id
    {
        get { return 0; }
    }
}

除了此實現之外,您還可以為基類定義默認值(作為虛擬屬性)。 結果,並非每個類都必須重寫Id屬性。

通過此實現,您可以將ObjectId作為輸入類型傳遞給函數,如果為null ,則返回0

public static int returnId(ObjectId input)
{
    return (input != null) ? input.Id : 0; // input.Id will never be null.
}

暫無
暫無

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

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