如何以通用方式编写下面的逻辑

本文关键字:方式编 | 更新日期: 2023-09-27 17:56:34

>我有一个像下面的模型

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

在我的 implmentation 类中,我有一个将 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< 如何在此处传递模型 >().ToArray();

溶液:

这将起作用,太好了。

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

感谢usr&Rune FS

如何以通用方式编写下面的逻辑

你可以

使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();
           [...]
    }
    [...]
}

您是否尝试过在 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";
    }