使用<t>(T obj)和Linq查询</t>

时间:2014-03-08 02:05:54

标签: c# linq azure

我有以下方法

public static async void CheckAndInsert<T>(T obj) 
{
    var data = AppDelegate.Self.InstanceLive.LoadAllAsync<T>().Result.ToList();
    if (data.Count != 0)
    {
        var theData = data.FirstOrDefault(t => t.id == obj.id);
        if (theData == null)
            await StoreData(theData);
        else
        {
            if (theData.__updatedAt != obj.__updatedAt)
                await UpdateData(theData);
        }
    }
}

数据库包含从Azure数据库生成的表,因此保证始终具有id。

理论上,这段代码应该有效,但在编译时,我收到的错误是

  

类型T不包含'id'的定义,也没有'T'类型的扩展方法'id'

有没有办法让这段代码运行?

1 个答案:

答案 0 :(得分:4)

这里的问题是,使用此通用方法声明T可以是任何类型,包括那些不提供Id成员的类型。显然,在这种情况下你的代码会破坏,因此编译器不允许它。

要解决此问题,您需要提供generic type constraints来约束T,以确保它具有Id属性。

public static async void CheckAndInsert<T>(T obj) where T:IIdentity

让你的模型类实现IIdentity,它看起来像

public interface IIdentity
{
    int Id{get;}
}