【问题标题】:How to write below logic in Generic way?如何以通用方式编写以下逻辑?
【发布时间】:2013-01-30 21:16:38
【问题描述】:

我有一个像下面这样的模型

public sealed class Person
{
        public string MobileNo { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
}

在我的实现类中,我有一个将IEnumerable 作为参数的方法

public string PersonList(string listName, IEnumerable<Person> persons)
{
   dictionary.Add("name", new String[1] { listname }); 
   dictionary.Add("list", persons.ToArray());

    PrivateMethod("personList", dictionary);
}

我有另一个私有方法

private string PrivateMethod(string value, Dictionary<string, object[]> parameters)
{
    foreach (KeyValuePair<string, object[]> kvp in parameters)
    {
           Person[] persons = kvp.Value.Cast<Person>().ToArray();

           [...]
    }

[...]
}

我想让上面的方法可重用,不想把 "Person" 模型紧密耦合。

我可以使用动态吗?

ContactList(string listName, IEnumerable<dynamic> persons)

并且在私有方法内

dynamic[] persons = kvp.Value.Cast&lt;如何在这里传递模型&gt;().ToArray();

解决方案:

这会奏效的,太好了。

 dynamic[] persons = kvp.Value.Cast<dynamic>().ToArray();

感谢 usrRune FS

【问题讨论】:

  • 你想用persons做什么? .Cast&lt;dynamic&gt;() 呢?
  • @usr:.Cast&lt;dynamic&gt;() 会起作用吗?
  • @ShubhajyotiGhosh 试试 :)

标签: c# .net generics generic-programming


【解决方案1】:

您可以将PrivateMethod 设为通用:

private string PrivateMethod<T>(string value, Dictionary<string, object[]> parameters)
{
    foreach (KeyValuePair<string, object[]> kvp in parameters)
    {
           T[] items = kvp.Value.Cast<T>().ToArray();
           [...]
    }

    [...]
}

【讨论】:

  • 然后我必须将类设为通用类,例如 Sample&lt;T&gt; 。否则我如何将 T 传递给 Private 方法?
  • 像这样:PrivateMethod&lt;Person&gt;("personList", dictionary);.
  • 如果我写这个PrivateMethod&lt;Person&gt;,那么我必须在实现类中引用模型。这是我不想要的。因为现在是人。但它可以是任何事情取决于需要。
  • @ShubhajyotiGhosh:我不确定你是否理解。您可以使用您想要的任何类型调用PrivateMethod(这就是&lt;T&gt; 的含义),因为它将被您传递给方法的类型替换(例如Person)。我建议你阅读Generics over at MSDN
【解决方案2】:

您是否尝试过在 c# 中使用“接口”?您可以将任何对象转换为任何类型,只要它们都派生到相同类型的接口。

interface IPerson
{
    string MobileNo { get; set; }
    string Name { get; set; }
    string LastName { get; set; }
}

class Person : IPerson
{
    public string MobileNo { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
}

class execute
{
    private Dictionary<string, object[]> dictionary = new Dictionary<string,object[]>();

    public void run()
    {
        List<IPerson> persons = new List<IPerson>();
        persons.Add(new Person()
        {
            LastName = "asdf",
            Name = "asdf",
            MobileNo = "123123"
        });

        persons.Add(new Person()
        {
            LastName = "aaaa",
            Name = "dddd",
            MobileNo = "1231232"
        });

        string x = PersonList("somelistname", persons);
    }


    public string PersonList(string listName, IEnumerable<IPerson> persons)
    {
        //dictionary.Add("name", new String[1] { listName });
        dictionary.Add("list", persons.ToArray());

        return PrivateMethod("personList", dictionary);
    }

    private string PrivateMethod(string value, Dictionary<string, object[]> parameters)
    {
        foreach (KeyValuePair<string, object[]> kvp in parameters)
        {
            IPerson[] persons = kvp.Value.Cast<IPerson>().ToArray();

        }

        return "somestring";
    }

【讨论】:

  • 不错的方法,谢谢。实际上我在原始代码块中使用了接口。如果我没记错的话,你的方法符合 DI 标准。
  • 请注意,这个解决方案虽然对 OP 来说已经足够了,但仍然限制你——在这种情况下——IPerson 接口,而泛型更强大。主题。
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多