在不知道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的类型。

任何想法,我如何可以创建它的实例,并执行方法"转换"?

在不知道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
}