提问人:user3772108 提问时间:7/19/2021 更新时间:7/20/2021 访问量:98
强制转换 [duplicate] 后泛型方法内的 C# 匿名对象属性
C# anonymous object property inside a generic method after casting [duplicate]
问:
CS1061 “对象”不包含“Id”的定义
public static async Task RemoveItem<T>(object obj) where T : class, new()
{
if (obj == null || db == null)
return;
obj = obj as T;
await db.DeleteAsync<T>(obj.Id); // error
}
这是可以解决的还是我已经到达了边缘?
答:
-2赞
user3772108
7/19/2021
#1
重要提示:该问题被标记为重复且已关闭。尽管如此,由于评论,我想分享我的原始解决方案和结果。
在打字时,我找到了解决方案:-) 感谢测试属性是否在动态变量上可用
public static async Task RemoveItem<T>(object obj) where T : class, new()
{
if (obj == null || db == null)
return;
dynamic objA = obj as T;
try
{
int id = objA.Id; // Check if property exists
await db.DeleteAsync<T>(id);
}
catch (Exception)
{
throw;
}
}
评论后编辑:
public static async Task RemoveItem<T>(object obj) where T : class, IDatabaseEntity, new()
{
if (obj == null || db == null)
return;
var entity = obj as IDatabaseEntity;
await db.DeleteAsync<T>(entity.Id);
}
评论
1赞
Jon Skeet
7/19/2021
为什么你抓住了一个例外,却又重新抛弃了它?
3赞
Christoph Sonntag
7/20/2021
尽管您的方法有效,但我建议您考虑在您的类型上使用接口。 .定义一个公共属性,所有数据库实体都应继承自该属性。然后,您可以将输入参数更改为 。使用动态总是很危险的,我只会将它们用作最后的手段 - 它们为注入攻击以及各种错误和意外行为打开了向量。T
where T: class, new(), IDatabaseEntity
IDatabaseEntity
Id
T obj
0赞
user3772108
7/20/2021
谢谢你的评论,伙计们。这是我正在寻找改进的反馈。:-)
1赞
Christoph Sonntag
7/20/2021
P.S.:我认为这个答案会给你更多关于动力学的见解。
0赞
user3772108
7/20/2021
谢谢@Compufreak我会检查一下。:-)
评论