繁体   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