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