2

我有一个类似的问题,并试图用代码来描述它,因为它更容易解释。

基本上我有一个通用集合,所以不管它被实例化为哪种类型的集合,它都会有一些共同的属性和事件。我对这些常见的属性很感兴趣。

说,我有通用集合的实例化对象 - 获取这些属性并订阅事件的最佳方法是什么?我知道我可以通过实现一个接口并将其转换为接口定义来做到这一点,但我不喜欢这样做,因为我这样做只是为了满足一个要求。有没有更好的方法来重构它?

public interface IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod
{
    string Detail { get; }

    event Action<bool> MyEvent;
}

public class MyList<T> : List<T>
    //, IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod
{
    public string Detail
    {
        get;
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyList<int> mi = new MyList<int>();
        MyList<string> ms = new MyList<string>();
        MyList<char> mc = new MyList<char>();
        GetDetail(mi);
        GetDetail(ms);
        GetDetail(mc);
    }

    //please note that obect need not be mylist<t>
    static string DoSomeWork(Object object)
    {
        //Problem: I know myListObect is generic mylist
        //but i dont know which type of collection it is
        //and in fact i do not care
        //all i want is get the detail information

        //what is the best way to solve it
        //i know one way to solve is implement an interface and case it to get details
        var foo = myListObject as IDoNotLikeThisInterfaceDefinitionJustToPleaseGetDetailMethod;
        if (foo != null)
        {
            //is there another way?
            //here i also need to subsribe to the event as well?
            return foo.Detail;
        }
        return null;
    }
}
4

3 回答 3

3

您可以使您的方法通用:

static string GetDetail<T>(MyList<T> myList)
{
    return myList.Detail;
}

这将允许您使用已经编写的相同代码调用它,并完全消除接口。


根据评论进行编辑:

鉴于您不知道类型,并且您只是在检查 an object,看起来接口似乎是这里最好的方法。提供一个通用接口允许您公开您需要的所有成员,而不管集合中包含什么,这提供了正确的行为。

于 2013-06-18T17:31:53.387 回答
2

使您的GetDetail方法通用:

static string GetDetail<T>(MyList<T> list)
{
    return list.Detail;
}
于 2013-06-18T17:31:55.957 回答
1

编辑:我假设可能涉及多个集合类。如果实际上只有一个类——MyList<T>那么使用泛型方法绝对是正确的方法。

我知道我可以通过实现一个接口并将其转换为接口定义来做到这一点,但我不喜欢它,因为我这样做只是为了满足一个单一的要求。

你这样做是为了表达这些系列的共同点。除非公共成员正在实现一个接口,否则它们只是碰巧具有相同的名称 - 接口表明它们也具有相同的预期含义

使用接口是正确的方法 - 但不清楚为什么您的GetDetail方法不只是将接口作为参数......假设您根本需要该方法。

于 2013-06-18T17:32:12.170 回答