我有以下方法
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'
有没有办法让这段代码运行?
答案 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;}
}