在运行时解析属性。 C#

时间:2012-10-09 15:19:25

标签: c# dynamic properties

我有一些类有一些代码

public IEnumerable<TypeOne> TypeOne
    {
        get
        {
            if (db != null)
            {
                var col = db.Select<TypeOne>();
                if (col.Count > 0) return col;
            }
            return db2.TypeOne;
        }
    }
    public IEnumerable<TypeTwo> TypeTwo
    {
        get
        {
            if (db != null)
            {
                var col = db.Select<TypeTwo>();
                if (col.Count > 0) return col;
            }
            return db2.TypeTwo;
        }
    }

因为你可以看到有很多重复的代码,并且有相同的属性名和可枚举的项类型。 我想调用像obj.MyProp这样的对象的一些属性。并且必须在运行时使用一些通用或非泛型方法解析MyProp。有可能吗?

3 个答案:

答案 0 :(得分:3)

稍微不完整的答案,但你会得到一般的想法:

这是您想要泛型的场景。

public IEnumerable<t> TypeSomething
{
    get
    {
        if (db != null)
        {
            t col = db.Select<t>();
            if (col.Count > 0) return col;
        }
        return GetDB<t>();
    }
}

您需要实现GetDB()以返回任何给定类型的相应数据库,但这只是一个开关(或者您可以使用反射来查找它)

答案 1 :(得分:0)

您可以使用泛型来解决此问题:

public IEnumerable<TypeOne> TypeOne
{
    get { return GetTable<TypeOne>(); }
}

public IEnumerable<TypeTwo> TypeTwo
{
    get { return GetTable<TypeTwo>(); }
}

private IEnumerable<T> GetTable<T>()
{
    if (db != null)
    {
        var col = db.Select<T>();
        if (col.Count > 0) return col;
    }

    return db2.Select<T>();    
}

答案 2 :(得分:0)

有几种方法可以做到这一点。最好的可能是通用方法:

public IEnumerable<T> dbSelect<T>() //may need type constraints here
{
    return db != null
           ? db.Select<T>()
           : null;
}
public IEnumerable<TypeOne> TypeOne
{
    get { return dbSelect<TypeOne> ?? db2.TypeOne; }
}
public IEnumerable<TypeTwo> TypeTwo
{
    get { return dbSelect<TypeTwo>() ?? db2.TypeTwo; }
}

如果您的db2对象具有类似Select<T>的通用db类型方法,则更容易:

public IEnumerable<T> dbSelect<T>()
{
    return db != null
           ? db.Select<T>()
           : db2.Select<T>(); //or db2.GetEntities<T>() or db2.OfType<T> or whatever
}

//Later, in your main code...
var x = dbSelect<TypeOne>();
var y = dbSelect<TypeTwo>();

这将是类型安全的,相当比反射更快,并且可以与Intellisense一起使用。