C# 如何将我的类转换为动态类型<;T>;通过使用泛型

C# 如何将我的类转换为动态类型<;T>;通过使用泛型,c#,generics,C#,Generics,我有一个如下的函数 private IList<ContactList> getEmptyRow() { var _ContactList = new List<ContactList>(); _ContactList.Add(new ContactList() { Email = string.Empty, Name = string.Empty }); return _ContactList;

我有一个如下的函数

private IList<ContactList> getEmptyRow()
{
    var _ContactList = new List<ContactList>();
    _ContactList.Add(new ContactList()
    {
        Email = string.Empty,
        Name = string.Empty
    });

    return _ContactList;
}
这可能吗?怎么做

每一个建议都将受到感谢。

也许是这样的吧

public interface IPerson
{ 
    string Email {get;set;}
    string Name {get;set;}
}

public class SomeClass
{
    private IList<T> getEmptyRow<T>() where T : IPerson, new()
    {
        var t = new List<T>();
        t.Add(new T()
        {
            Email = string.Empty,
            Name = string.Empty
        });

        return t;
    }
}
公共接口IPerson
{ 
字符串电子邮件{get;set;}
字符串名称{get;set;}
}
公共类
{
私有IList getEmptyRow(),其中T:IPerson,new()
{
var t=新列表();
t、 添加(新的t()
{
Email=string.Empty,
Name=string.Empty
});
返回t;
}
}

您需要一个接口或基类,这样您就可以设置公共属性
Email
Name
,还需要
new()
约束,这样您就可以使用默认构造函数。

有点晚,因为您已经接受了答案,但作为替代,尤其是如果
new()
不是选项,您可以使用预定义的构造函数/初始化语法设置提供程序,这将为您提供一些灵活性:

public static class EmptyRowProvider
{
    private static Dictionary<Type, object> TypeCreators = new Dictionary<Type, object>();

    public static void RegisterType<T>(Func<T> emptyTypeCreator)
    {
        TypeCreators.Add(typeof(T), emptyTypeCreator);
    }

    public static IList<T> GetEmptyRow<T>()
    {
        object typeCreatorUntyped;
        if (!TypeCreators.TryGetValue(typeof(T), out typeCreatorUntyped))
            throw new Exception("Type " + typeof(T).FullName + " not registered!");

        Func<T> typeCreator = (Func<T>)typeCreatorUntyped;

        IList<T> emptyRow = new List<T>();
        emptyRow.Add(typeCreator());
        return emptyRow;
    }
}
那么您的新代码用法可能如下所示:

EmptyRowProvider.RegisterType(() => new ContactList(String.Empty, String.Empty, true));


var emptyRow = EmptyRowProvider.GetEmptyRow<ContactList>();

Console.WriteLine(emptyRow.Count); //1
Console.WriteLine(emptyRow[0].Email == String.Empty); //true
Console.WriteLine(emptyRow[0].Name == String.Empty); //true
Console.WriteLine(emptyRow[0].IsPrivate == true); //true
最后,您可以使用不同的初始化注册多个不同的类型,但实现相同的用法:

EmptyRowProvider.RegisterType(() => new ContactList(String.Empty, String.Empty, true));
EmptyRowProvider.RegisterType(() => new Person("John", "Doe"));
EmptyRowProvider.RegisterType(() => UserProvider.SetupAnonymousUser("myusername", "mypassword", LoginType.Anonymous));

ContactList emptyContactList = EmptyRowProvider.GetEmptyRow<ContactList>();
Person emptyPerson = EmptyRowProvider.GetEmptyRow<Person>();
User emptyUser = EmptyRowProvider.GetEmptyRow<User>();
EmptyRowProvider.RegisterType(()=>新联系人列表(String.Empty,String.Empty,true));
EmptyRowProvider.RegisterType(()=>新人(“约翰”、“多伊”);
EmptyRowProvider.RegisterType(()=>UserProvider.SetupAnonymousUser(“myusername”、“mypassword”、LoginType.Anonymous));
ContactList emptyContactList=EmptyRowProvider.GetEmptyRow();
Person-emptyPerson=EmptyRowProvider.GetEmptyRow();
用户emptyUser=EmptyRowProvider.GetEmptyRow();

这还假设IPerson的所有实现都存在一个无参数构造函数。在
其中t:IPerson,new()
中,不可能为函数赋予动态对象,而不是直接使用IPerson?回答得很好。我非常感谢你的努力@Chris SinclairI喜欢在代码中注册多种不同类型的方式。
public ContactList(string email, string name, bool isPrivate)
{
    //initialize data here  
}
EmptyRowProvider.RegisterType(() => new ContactList(String.Empty, String.Empty, true));


var emptyRow = EmptyRowProvider.GetEmptyRow<ContactList>();

Console.WriteLine(emptyRow.Count); //1
Console.WriteLine(emptyRow[0].Email == String.Empty); //true
Console.WriteLine(emptyRow[0].Name == String.Empty); //true
Console.WriteLine(emptyRow[0].IsPrivate == true); //true
EmptyRowProvider.RegisterType(() => ContactListFactory.Create(String.Empty, String.Empty));
EmptyRowProvider.RegisterType(() => new ContactList(String.Empty, String.Empty, true));
EmptyRowProvider.RegisterType(() => new Person("John", "Doe"));
EmptyRowProvider.RegisterType(() => UserProvider.SetupAnonymousUser("myusername", "mypassword", LoginType.Anonymous));

ContactList emptyContactList = EmptyRowProvider.GetEmptyRow<ContactList>();
Person emptyPerson = EmptyRowProvider.GetEmptyRow<Person>();
User emptyUser = EmptyRowProvider.GetEmptyRow<User>();