是否可以通过方法名称约束类型?

时间:2014-05-12 22:50:37

标签: c# generics

例如,类型AABBCC都有方法Close()。它们不会在其中实现任何类型的void Close()接口。是否可以基于具有名为Close

的方法的类型来执行类型约束
public static void CloseThis<T>(this T openObject) where T : Closeable
{
    openObject.Close();
}

3 个答案:

答案 0 :(得分:6)

您可以这样做:

class Abc
{
    public void Close()
    { }
}

interface IClosable
{
    void Close();
}

class AbcClosable : Abc, IClosable
{ }

class GenClosable<T> where T : IClosable
{ }

然后使用

var genClosable = new GenClosable<AbcClosable>();

或创建通用扩展方法

public static void CloseThis<T>(this T openObject) where T : Closeable
{
    openObject.Close();
}

然后将其用作

var abcClosable = new AbcClosable();
abcClosable.CloseThis();

答案 1 :(得分:1)

至于我,解决方案应该基于聚合而不是继承。为什么? &#34;它们是我无法编辑的类型&#34;。我认为因为这种类型属于另一个开发者公司| etc并且继承增加了耦合,所以解决方案应该基于聚合。

请注意,AABBCC中的任何一个都可以是sealed,也可以是sealed

public sealed class Aa
{
    public void Close()
    {
    }
}

public interface IClosable
{
    void Close();
}

internal class AbcClosable : IClosable
{
    private readonly Aa _aa;

    public AbcClosable(Aa aa)
    {
        _aa = aa;
    }

    public void Close()
    {
        _aa.Close();
    }
}

public static class CloseableExtensions
{
    public static void CloseThis<T>(this T value)
        where T : IClosable
    {
        value.Close();
    }
}

答案 2 :(得分:0)

您可以使用反射来测试对象是否具有close方法,然后在它存在时调用它。

    static void CloseIfClosable(object o)
    {
        Type oType = o.GetType();
        MethodInfo closeMethod = oType.GetMethod("Close");
        if (closeMethod != null)
        {
            closeMethod.Invoke(o, new object[] { });
        }
    }

一般来说,你想避免反思,但如果你被迫使用控制之外的麻烦类型,那么它可能是最好的选择。