用通用扩展方法替换继承

时间:2018-12-13 11:02:16

标签: c#

我创建了一个继承自KeyedByTypeCollection的类,并对其进行了扩展。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.keyedbytypecollection-1?view=netframework-4.7.2

KeyedByTypeCollection仅具有Find方法,如果未找到任何项,则返回null。我更喜欢TryGetValue方法,所以我添加了一个。

internal class TypeCollection<V> : KeyedByTypeCollection<V>
{
    public T ValueOrDefault<T>() where T : V
    {
        if (!Contains(typeof(T)))
        {
            return default(T);
        }

        return (T)this[typeof(T)];
    }

    public bool TryGetValue<T>(out T value) where T : V
    {
        if (!Contains(typeof(T)))
        {
            value = default(T);
            return false;
        }

        value = (T)this[typeof(T)];
        return true;
    }
}

没有东西可以继承。我只想扩展现有的课程。我从这两种扩展方法开始

internal static class KeyedByTypeCollectionExtensions
{
    public static T ValueOrDefault<T>(this KeyedByTypeCollection<V> collection) where T : V
    {
        if (!collection.Contains(typeof(T)))
        {
            return default(T);
        }

        return (T)collection[typeof(T)];
    }

    public static bool TryGetValue<T>(this KeyedByTypeCollection<V> collection, out T value) where T : V
    {
        if (!collection.Contains(typeof(T)))
        {
            value = default(T);
            return false;
        }

        value = (T)collection[typeof(T)];
        return true;
    }
}

但是如何设置这些扩展方法?我必须为通用类型V设置什么?

1 个答案:

答案 0 :(得分:3)

您将必须定义 int result = 1; for (int j = 0; j < inputArray.Length; j++) { result = result * inputArray[j]; } for (int i = 0; i < resultArray.Length; i++) { resultArray[i] = result / inputArray[i]; }

V

public static T ValueOrDefault<T,V>(this KeyedByTypeCollection<V> collection) where T : V

它将与public static bool TryGetValue<T,V>(this KeyedByTypeCollection<V> collection, out T value) where T : V 一起很好地工作,因为编译器会知道使用了哪种类型,但是对于TryGetValue,您将不得不设置这两种类型,这有点难看。 / p>

让我们考虑以下类别:

ValueOrDefault

那么用法可以是:

public class A { }
public class B : A { }