我可以创建一个包含不同种类通用对象的对象包吗?

时间:2014-06-16 18:34:55

标签: c# generics

这个很难拿到一个好头衔,所以我尽了最大的努力。

问题在于:

Dictionary<string,ILayer> _layers = new Dictionary<string,ILayer>();
_layers.Add("IntLayer",new Layer<int>());
_layers.Add("GuidLayer",new Layer<Guid>());
Guid value = _layers["GuidLayer"].GetValue(int x, int y);

课程:

public class Layer<T> : ILayer
{
    public T[,] Matrix { get; set; }

    public T GetValue(int x, int y)
    {
        return Matrix[x, y];
    }
}   

public interface ILayer
{
    //T GetValue(int x, int y);
}

这个想法是能够存储不同类型的图层,并避免显式投射。虽然在尝试获取值时会知道类型,因此可以安全地进行转换,但是如果我想在整个层中应用某些东西,那么对于“通用”方法来说会更复杂一点。< / p>

是否可以创建此方案?我应该对这个问题采用完全不同的方式吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

如果你想避免在客户端代码中进行显式转换,我可以考虑几个选项:

选项1

public interface ILayer
{
    U GetValue<U>(int x, int y);
}

public class Layer<T> : ILayer
{
    public T[,] Matrix { get; set; }

    U ILayer.GetValue<U>(int x, int y)
    {
        return (U) (object) Matrix[x, y];
    }
} 

选项2

public interface ILayer
    {
    }

    public class Layer<T> : ILayer
    {
        public T[,] Matrix { get; set; }

        public T GetValue(int x, int y)
        {
            return Matrix[x, y];
        }
    }

    public static class LayerExtensions
    {
        public static U GetValue<U>(this ILayer layer, int x, int y)
        {
            return ((Layer<U>)layer).GetValue(x, y);
        }
    }