如何关闭类以仅接受特定的类型对象

时间:2010-01-14 12:32:40

标签: c# .net architecture .net-3.5

我有这个类接受从代码中不同位置调用的Dictionary<string,object>。字典概念使得事情无类型化,很难弄清楚要传递什么类来运行,否则它会抛出运行时异常。由于这个Dictionary<string,object>是一个契约定义所以我必须编写一个扩展方法来在调用我的类时将我的类型转换为字典。但是现在我怎么能关闭这个只接受特定类型

的类

所以对于例如。

public class CreateReport : IRep
{

public void SetParam(Dictionary<string,object> parm)
{
 // Here the dictionary param are been set. 
}

 public object RunRep()
{

}
}

ClassInvoker.Invoke(CreateReport , Dictionary<string,object>{"MyParam" , "World"});

所以这就是现在的情况。

我通过创建一个Property类作为

来改变它
public class CreateReportProp
{
  public string MyParam { get;set;}
}

并将扩展方法设为ConvertObjToDict

所以现在我们必须做类似

的事情
ClassInvoker.Invoke(CreateReport , new CreateReportProp { MyParam = "World"}.ConvertObjToDict());

但我想进一步关闭Class,以便CreateReportClass只能传递CreateReportParam,否则编译器会抛出异常。

请给我一些想法,我怎么能实现这一点。

4 个答案:

答案 0 :(得分:0)

为什么不使用强类型字典:

public void SetParam<T>(Dictionary<string, T> parm)
{
}

答案 1 :(得分:0)

我会使用通用接口  你需要2个接口,一个使用强类型字典的通用类型intherface。 那么你可以使用接口而不用担心类,因为实现接口的每个类都会考虑如何处理数据。

public interface IExample<t> : IExample
{
 AddDictionary(T);
}

public interface IExample
{
 AddDictionary(object)
}

然后编写对象版本以转换为类型版本并在那里实现。

添加你需要的任何其他通用方法,然后你正在使用的类将管理自己,所有应该是hunky dory ...即如果我理解你的话。

答案 2 :(得分:0)

您可以使用 where 关键字来限制泛型。这是一个使用链表

的简单示例
public class LinkedList<K,T> where K : IComparable
{
   T Find(K key)
   {
      Node<K,T> current = m_Head;
      while(current.NextNode != null)
      {
         if(current.Key.CompareTo(key) == 0)

            break;
         else      

            current = current.NextNode;
      }
      return current.Item; 
   }
   //Rest of the implementation 
}

答案 3 :(得分:0)

我认为您正在使用CreateReport类来处理许多特定报告?如果是这种情况,您有机会进行编译时检查。如果CreateReport类动态调用报表,即按名称调用,并且每个报表都有不同的参数要求,则无法进行编译时检查。

在第一种情况下,您将更改CreateReport类的签名,如下所示:

public class CreateReport<T> : IRep, where T : CreateReportProp

在SetParam方法中,您将拥有

public void SetParam(T param)

对于每个特定报告,只要它继承自CreateReportProp,您就可以创建不同的属性类。然后,当您实例化报告类时,您将指定该报告类。

CreateReport<MySpecificParam> myReport = new CreateReport<MySpecificParam>();
myReport.SetParam( new MySpecificParam() {...});

如果您希望在CreateReport类中进行较少的更改,您可以让CreateReportProp实现IEnumerable或IDictionary接口,以便迭代参数更通用。