我正在尝试编写一个接受任何类型并创建其实例的泛型方法,以便我以后可以使用它:
我想动态生成的类的示例:
public class bb_ColorScaleCriteriaTypes
{
public Dictionary<string, int> Types { get; set; }
public bb_ColorScaleCriteriaTypes()
{
this.Types = new Dictionary<string, int>()
{
{"LowestValue", 1},
{"Number", 0},
{"Percent", 3},
{"Formula", 4},
{"Percentile", 5},
{"HighestValue", 2},
{"AutomaticMax", 7},
{"AutomaticMin", 6},
{"None", -1}
};
}
public static int byName(string name)
{
if (name == null)
{
throw new ArgumentException("name");
}
int intValue = new bb_ColorScaleCriteriaTypes().Types[name];
return intValue;
}
}
通常我有另一个课程,我可以这样称呼:
public class bb_ColorScaleCriteriaTypesUI : DSDropDownBase
{
private const string NO_FAMILY_TYPES = "No types were found.";
public bb_ColorScaleCriteriaTypesUI() : base("Color Scale Criteria Type") { }
// Get Data Class that holds dictionary
public static bb_ColorScaleCriteriaTypes cscTypes = new bb_ColorScaleCriteriaTypes();
protected override SelectionState PopulateItemsCore(string currentSelection)
{
Items.Clear();
Dictionary<string, int> d = new Dictionary<string, int>(cscTypes.Types);
}
正如您所看到的,我正在实例化一个bb_ColorScaleCriteriaTypes类,然后在其上调用Types。但是,我想写一个更通用的实现,我可以做类似的事情:
public abstract class bb_ColorScaleCriteriaTypesUI : DSDropDownBase
{
public bb_ColorScaleCriteriaTypesUI (string name, Type elementType) : base(name) { this.ElementType = elementType; PopulateItems(); }
private const string noTypes = "No Types available.";
public Type ElementType;
// how to instantiate an instance of ElementType here?
protected override SelectionState PopulateItemsCore(string currentSelection)
{
if (this.ElementType != null)
{
Dictionary<string, int> d = new Dictionary<string, int>(myTypeInstance.Types); //so I can call it here
}
在评论中看起来有点失控。
无论如何,我不介意使用Activator.CreateInstance()但是如何创建一个类型的实例并将其强制转换为类型,以便它不是通用对象?
答案 0 :(得分:3)
Activator.CreateInstance()正如其他人所说的那样。返回类型不是通用对象,它是您请求的实际类型,它只是作为对象返回,因为它是所有内容的基类。
如果你想“正确的方式”,你将定义一个所有类派生/实现的接口或基类,并具有在接口/基类中一般定义的通用方法。然后,您可以使用Activator.CreateInstance()或工厂模式来新建对象,并将它们作为接口/基类返回。