例如,类型AA
,BB
和CC
都有方法Close()
。它们不会在其中实现任何类型的void Close()
接口。是否可以基于具有名为Close
?
public static void CloseThis<T>(this T openObject) where T : Closeable
{
openObject.Close();
}
答案 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并且继承增加了耦合,所以解决方案应该基于聚合。
请注意,AA
,BB
或CC
中的任何一个都可以是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[] { });
}
}
一般来说,你想避免反思,但如果你被迫使用控制之外的麻烦类型,那么它可能是最好的选择。