当前位置:  开发笔记 > 编程语言 > 正文

测试C#泛型类型的分配

如何解决《测试C#泛型类型的分配》经验,为你挑选了1个好方法。

有没有什么方法可以测试泛型方法中泛型参数的实例是否已分配给它可以是值还是引用类型?我希望能够在一个通用方法中执行此操作,我必须持久化类型,其中T是实例,K是该类型的标识符字段的类型(我持久存在的所有对象都有,因为它们从基类继承类型).我不想将K限制为值类型.代码是这样的:

public static bool Save(T instance)
{
    // variable to hold object identifer
    K instanceId = default(K);

    PropertyInfo[] properties = typeof(T).GetProperties();

    // loop through properties of the T
    // if property is decorated with a specific attribute then assign to instanceId
    // end loop

    // check that we have a value assigned to instanceId other than default(K)
    // if not return false otherwise continue to persist item
}

由于K可以是值类型,因此检查它是否等于默认值(K)会导致错误,因为它依赖于它是可比较的.有没有解决的办法?

请注意,在当前情况下,通过在泛型类型T上放置一个必须从基类型BaseObject继承的条件,我已经满足了这个需求,所以我的问题是关于泛型和测试赋值的一般问题.



1> Jon Skeet..:

如果您instanceId稍后要阅读,则必须从编译器的角度明确分配它.我会给它分配default(K)并单独有一个标志,说明它是否被赋予了有用的值:

public static bool Save(T instance)
{
    bool idAssigned = false;
    // variable to hold object identifer
    K instanceId = default(K)

    PropertyInfo[] properties = typeof(T).GetProperties();

    foreach(PropertyInfo property in properties)
    {
        if (SomeCondition(property))
        {
            instanceId = GetId(property);
            idAssigned = true;
        }
    }

    if (!idAssigned)
    {
        return false;
    }
    Persist(whatever);
    return true;
}

编辑:将值instanceId任何特定值进行比较是非启动的,除非您知道该值永远不会用于显式指定的"正常"值instanceId.

基本上你在这里有两位信息,所以请分开保存 - 标志是要走的路.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有