我目前正在为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;?
答案 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
}