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>();