在 C# 中安全地转换泛型类型

瓦希德

如何根据给定的泛型类型安全地转换和返回 m_obj。

private IObject m_obj;
public bool TryGetAs<T>(out T value) where T :IObject
{
    value = m_obj as T; // The type parameter 'T' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint

    // value = (T)m_obj; This compiles!

    if (value != null)
        return true;

    return false;
}

我知道如果 m_obj 我有一个列表,我可以简单地这样做:

private readonly IList<Object> m_objects;

internal IList<T> Collect<T>() where T : IObject
{
    return m_objects.OfType<T>().ToList();
}

但是我找不到以前代码的解决方案。

public interface IObject
{

}

我的答案:

    public bool TryGetAs<T>(out T value) where T :IObject
    {
        value = default(T);
        if (!(m_obj is T))
            return false;

        value = (T)m_obj;
        return true;
    }
什么

as操作者被保留用于引用类型。如果T始终是引用类型,则解决方案是classTryGetAs<T>. 如果T也可以是值类型,这不是一个选项。在这种情况下,您可以使用is运算符:

public bool TryGetAs<T>(out T value) where T : IObject
{
    if(m_obj is T)
    {
        value = (T)m_obj;
        return true;
    }
    else
    {
        value = default(T);
        return false;
    }
}

在 C# 7.0 中,您可以像这样简化它(并提高性能,因为您不需要is强制转换然后再进行其他类型转换):

public bool TryGetAs<T>(out T value) where T : IObject
{
    if(m_obj is T tValue)
    {
        value = tValue;
        return true;
    }
    else
    {
        value = default(T);
        return false;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章