我有两个字符串列表。一个是对象友好名称,另一个是对象类名称。
"Car","Animal","Plane"
"MachineClass","AnimalClass","FlyClass".
我使用友好名称来显示用户输入和类名,以通过使用反射来动态创建类实例,所以我需要两个列表,就像你可以看到“Car”一样友好名称可以绑定到“Machine.cs”。 / p>
我需要一些更有创意的方式来处理和翻译这两个列表,而不是使用从一个字符串转换为另一个字符串的switch语句,这些列表有很多项目,我可以进行小拼写,这将导致错误。此外,有时,我发送测试名称的字符串用于评估,而拼写的相同问题可以在那里应用。
我试着考虑使用枚举,但数字不会响起两个列表之间的转换。
答案 0 :(得分:4)
public enum Things
{
Car,
Animal,
Plane
}
var dict = new Dictionary<Things, string> {
{ Things.Car, "MachineClass" },
{ Things.Animal, "AnimalClass" },
{ Things.Plane, "FlyClass" } };
string classname = dict[Things.Plane]; // FlyClass
现在,如果你想要真正的类型,你可以实例化:
var realtypes = dict.ToDictionary(
kvp => kvp.Key,
kvp => System.Type.GetType("Namespace." + kvp.Value));
完整的工作示例位于http://ideone.com/TTuBP:
using System;
using System.Collections.Generic;
using System.Linq;
//public interface IThing {}
public class MachineClass /* : IThing */ { }
public class AnimalClass /* : IThing */ { }
public class Plane /* : IThing */ { }
public class Program
{
public enum Things
{
Car,
Animal,
Plane
}
private static readonly IDictionary<Things, string> _classNameMap =
new Dictionary<Things, string> {
{ Things.Car, "MachineClass" },
{ Things.Animal, "AnimalClass" },
{ Things.Plane, "FlyClass" } };
public static void Main(string[] args)
{
var realtypes = _classNameMap.ToDictionary(
kvp => kvp.Key,
kvp => System.Type.GetType(/*"Namespace." +*/ kvp.Value));
Type dynamicType = realtypes[Things.Plane]; // typeof(Namespace.FlyClass)
foreach (var realtype in realtypes)
Console.WriteLine("{0}, class {1}",
realtype.Key, realtype.Value);
}
}
答案 1 :(得分:0)
为什么不使用字典?
Dictionary<string, string> classMap_ = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
classMap_["Car"] = "MachineClass";
classMap_["Animal"] = "AnimalClass";
classMap_["Plane"] = "FlyClass":
创建适当的类非常简单:
string className = classMap_["Car"];
答案 2 :(得分:0)
答案 3 :(得分:0)
我不建议从性能的角度使用反射来创建类的创建对象,并且可以使用lambda表达式来创建对象 看下面的代码
var animals = new Dictionary<string, Func<object>>
{
{"Animal 1", () => new MyAnimal1()},
{"Animal 2", () => new MyAnimal2()}
};
var createAnimal = animals["Animal 1"];
var animal = createAnimal();
其中
private class MyAnimal1
{
}
private class MyAnimal2
{
}
这些课程你应该使用你的课程。
答案 4 :(得分:0)
为什么不使用数据绑定?
class Wrapper
{
public string UserFriendly{get;set;}
public string Technical{get;set;}
}
var data = new[]
{
new Wrapper("Car", "MachineClass"),
new Wrapper("Plane", "FlyClass"),
};
combo.Datasource = data;
combo.DisplayMember = "UserFriendly";
combo.ValueMember = "Technical";
组合将显示友好名称,但在询问SelectedValue时,您将获得技术名称。