在不知道T的情况下创建泛型实例
本文关键字:创建 泛型 实例 情况下 不知道 | 更新日期: 2023-09-27 18:12:38
我目前正在为MVC开发一个通过数据注释工作的网格。
所以,我有一个接口,将对象从给定类型转换为另一种类型:
public interface ITypeConverter<in T>
{
#region Propreties
bool IsValid { get; }
#endregion
#region Methods
string Convert(T propertyValue);
#endregion
}
如果我想让我的所有属性都以大写显示,我可以这样做:
public class UppercaseConverter : ITypeConverter<string>
{
#region ITypeConverter Members
public bool IsValid { get { return true; } }
public string Convert(string propertyValue)
{
return propertyValue.ToString().ToUpper();
}
#endregion
}
现在,在创建网格的类中,我想创建一个TypeConverter的实例。
if (gridColumnAttribute.TypeConverter != null)
{ TypeConverter = (ITypeConverter<object>)Activator.CreateInstance(gridColumnAttribute.TypeConverter); }
当然,这不起作用,因为我使用的是ITypeConverter,它应该是一个字符串。
但是我事先不知道T的类型。
任何想法,我如何可以创建它的实例,并执行方法"转换"?
不能通过使用TypeDescriptor来确定应该使用的TypeConverter吗?
TypeDescriptor.GetConverter(typeof(T));
差不多。
我不知道这种方法有多好,但这应该有所帮助。
我将引入一个带有Convert
方法的非泛型接口,以及一个助手抽象类。
public interface ITypeConverter
{
string Convert(object propertyValue);
}
public interface ITypeConverter<in T> : ITypeConverter
{
bool IsValid { get; }
string Convert(T propertyValue);
}
public abstract class TypeConverterBase<T> : ITypeConverter<T>
{
public string Convert(object propertyValue)
{
//Helper method just to call right overload of generic method.
return Convert((T) propertyValue);
}
public abstract bool IsValid { get; }
public abstract string Convert(T propertyValue);
}
public class UppercaseConverter : TypeConverterBase<string>
{
public override bool IsValid { get { return true; } }
public override string Convert(string propertyValue)
{
return propertyValue.ToString().ToUpper();
}
}
private static void Main(string[] args)
{
Type type = typeof(UppercaseConverter);
var converter = (ITypeConverter)Activator.CreateInstance(type);
var converted = converter.Convert("hello");
Console.WriteLine(converted);//Prints HELLO
}