在不知道T的情况下创建泛型的实例

时间:2014-07-11 07:08:42

标签: c# generics

我目前正在为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的类型。

关于如何创建它的实例并执行方法的任何想法&#34;转换&#34;?

2 个答案:

答案 0 :(得分:2)

您是否无法确定应使用TypeDescriptor使用的TypeConverter?

TypeDescriptor.GetConverter(typeof(T));

类似的东西。

答案 1 :(得分:1)

我不知道这种方法有多好,但这应该有所帮助。

我引入了一个带有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
}