【问题标题】:how to Close a Class to accept only specific Typed Object如何关闭一个类以仅接受特定的类型化对象
【发布时间】:2010-01-14 12:32:40
【问题描述】:

我有这个类,它接受从代码中不同位置调用的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 否则编译器会抛出异常。

请给我一些想法,我怎样才能做到这一点。

【问题讨论】:

  • 抛出异常是在运行时发生的事情。编译器(通常)不会抛出异常。

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


【解决方案1】:

我想您正在为许多特定报告使用 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 接口,以便更通用地迭代参数。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨达林,对不起,我没有明确说明它确实使用强类型字典。但我的问题更多与我如何关闭类以仅接受特定类型有关,而这反过来又会被转换我对字典的扩展方法。但是现在你可以看到我可以将任何类型传递给调用类,我只会得到运行时异常。我想要的是编译时间。
    【解决方案3】:

    我会使用通用接口 您需要 2 个接口,一个使用强类型字典的通用类型接口。 那么您就可以使用接口而不必担心类,因为实现接口的每个类都会关注如何使用数据。

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

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

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

    【讨论】:

      【解决方案4】:

      您可以使用 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 
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-26
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2022-10-04
        相关资源
        最近更新 更多