我想将通用参数的列表/字典(可以是同一集合中的不同类型)传递给模块化应用程序中的方法。 我希望我的代码可以更好地解释它。
接口:
public interface IField
{ }
public interface IField<T> : IField
{
T Value { get; }
}
已实施的课程:
public class Field<T> : IField<T>
{
public Field(T value)
{
Value = value;
}
public T Value { get; set; }
}
现在我可以使用我的参数创建一个Dictionary并调用一个在未引用的不同程序集中实现的方法(我使用反射得到它):
static void Main(string[] args)
{
var dicFields = new Dictionary<string, IField>();
dicFields.Add("param1", new Field<string>("Hello"));
dicFields.Add("param2", new Field<int>(15));
MyMethod(dicFields);
}
现在,在'MyMethod'中,我想获取字典中特定参数的值:
public void MyMethod(IDictionary<string, IField> parameters)
{
var param2 = parameters["param2"];
}
问题在于'param2'没有属性Value(泛型类型),因为我使用IField接口来定义字典元素,而在'MyMethod'中我们无法知道参数的正确实现。
有任何建议来实现我的目标吗?
答案 0 :(得分:0)
泛型不通过这种方式工作。
要获取通用类型,您需要使用字典中的IField<T>
接口和方法。
但是,您无法混合类型,因为在创建类的实例时,IField将仅限于T:
public interface IField
{
}
public interface IField<T> : IField
{
T Value { get; }
}
public class Field<T> : IField<T>
{
public Field(T value)
{
Value = value;
}
public T Value { get; set; }
}
public void Generic()
{
var dicFields = new Dictionary<string, IField<string>>();
dicFields.Add("param1", new Field<string>("Hello"));
dicFields.Add("param2", new Field<string>("Hello"));
MyMethod<String>(dicFields);
}
public void MyMethod<T>(IDictionary<string, IField<T>> parameters)
{
var param2 = parameters["param2"].Value;
}
如果你想混合类型,你需要使用IField,这需要你打包和取消打包你的类型:
公共接口IField {
}
public interface IField<T> : IField
{
T Value { get; }
}
public class Field<T> : IField<T>
{
public Field(T value)
{
Value = value;
}
public T Value { get; set; }
}
public void Generic()
{
var dicFields = new Dictionary<string, IField<object>>();
dicFields.Add("param1", new Field<object>("Hello"));
dicFields.Add("param2", new Field<object>(2));
MyMethod<object>(dicFields);
}
public void MyMethod<T>(IDictionary<string, IField<T>> parameters)
{
var param2 = parameters["param2"].Value;
}
虽然这被认为是不好的做法,但您可以使用Dictionary<string, Dynamic>
Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
dict.Add("value1", "a");
dict.Add("value2", 2);
dict.Add("value3", 3);
int result = dict["value2"] + dict["value3"];
答案 1 :(得分:0)
管理您尝试执行的操作的一种方法是向IField
添加访问方法,以便您获得object
值和类型。
public interface IField
{
object GetValue { get; }
Type GetValueType();
}