强制转换 [duplicate] 后泛型方法内的 C# 匿名对象属性

C# anonymous object property inside a generic method after casting [duplicate]

提问人:user3772108 提问时间:7/19/2021 更新时间:7/20/2021 访问量:98

问:

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
}

这是可以解决的还是我已经到达了边缘?

C# 泛型 匿名对象

评论


答:

-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
尽管您的方法有效,但我建议您考虑在您的类型上使用接口。 .定义一个公共属性,所有数据库实体都应继承自该属性。然后,您可以将输入参数更改为 。使用动态总是很危险的,我只会将它们用作最后的手段 - 它们为注入攻击以及各种错误和意外行为打开了向量。Twhere T: class, new(), IDatabaseEntityIDatabaseEntityIdT obj
0赞 user3772108 7/20/2021
谢谢你的评论,伙计们。这是我正在寻找改进的反馈。:-)
1赞 Christoph Sonntag 7/20/2021
P.S.:我认为这个答案会给你更多关于动力学的见解。
0赞 user3772108 7/20/2021
谢谢@Compufreak我会检查一下。:-)