开发者

How to determine lazy-loaded properties at runtime on a linq table?

I am iterating over the properties of various mapped tables in my code and need to know whether or not each property is lazy loaded. I have found that the instance variable used for storage, denoted by the Storage attribute on the property, will be of type System.Data.Linq.Link.

Is there a way that I can leverage these two facts at runtime to solve this problem?

Code:

public void LazyLoad(Type tableType)
{
    foreach (var prop in tableType.GetGenericArguments()[0].GetProperties())
    {
        if (/* IS LAZY LOADED */)
        {
       开发者_如何学Go     //real work here...
            Console.WriteLine(prop.Name);
        }
    }
}

The mappings look like this:

public partial class Address
{
    private System.Data.Linq.Link<string> _City;

    [Column(Storage="_City", DbType="...")]
    public string City
    {
        get { /* ... */ }
        set { /* ... */ }
    }
}


You are almost there. Just a spoon full of reflection helps the medicine go down ;-)

private static bool IsLazyLoadedProperty(PropertyInfo property)
{
    var column = property.GetCustomAttributes(typeof(ColumnAttribute), true)[0] 
        as ColumnAttribute;

    var field = property.DeclaringType.GetField(column.Storage, 
        BindingFlags.Instance | BindingFlags.NonPublic);

    if (!field.FieldType.IsGenericType)
    {
        return false;
    }

    return field.FieldType.GetGenericTypeDefinition() == typeof(Link<>);
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜