[英]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.