【问题标题】:C# pointer to another function in a different assembly指向不同程序集中另一个函数的 C# 指针
【发布时间】:2021-05-18 16:48:34
【问题描述】:

我想要一种符合人体工程学的方式来声明指向其他程序集中方法的本地指针。例如,我有一个用 VB.Net 编写的非常有用的函数(是的,我知道它是 VB,但它具有历史意义并且在广泛使用的程序集中),它是:

    Public Function IIN(oValue As Object, ParamArray oValues() As Object) As Boolean
        Dim iA As Integer

        For iA = oValues.GetLowerBound(0) To oValues.GetUpperBound(0)
            If oValue = oValues(iA) Then
                Return True
            End If
        Next

        Return False
    End Function

这是由 SQL IN 关键字启发的。它非常有用。它允许我使用这样的语句:

if (Dolphin.modGeneral.IIN(oResult.DataType.Code, "BIGINT", "DECIMAL", "FLOAT", "INT", "MONEY", "SMALLINT", "TINYINT"))
{

这比:

if ((oResult.DataType.Code == "BIGINT") || 
    (oResult.DataType.Code == "DECIMAL") || 
    (oResult.DataType.Code == "FLOAT") || 
    (oResult.DataType.Code == "INT") || 
    (oResult.DataType.Code == "MONEY") || 
    (oResult.DataType.Code == "SMALLINT") || 
    (oResult.DataType.Code == "TINYINT"))
{

我非常想让这个更简洁,以便我可以这样做:

if (IIN(oResult.DataType.Code, "BIGINT", "DECIMAL", "FLOAT", "INT", "MONEY", "SMALLINT", "TINYINT"))
{

它删除了程序集引用,但我想这样做而不在本地声明整个函数。

我曾经能够用 C 做一些事情(很多年前),对于这个例子来说,这相当于:

#define IIN Dolphin.modGeneral.IIN

由编译器处理,实际上是预编译文本替换。但是,在 C# 中,我必须这样做:

        private delegate bool delIIN(object oValue, params object[] oValues);
        private delIIN IIN;

然后在该类的所有构造函数中,我还需要有一个赋值语句,因此:

        IIN = Dolphin.modGeneral.IIN;

经过相当复杂的设置,我的实际问题是:有没有更简洁的方法可以声明这样的函数的快捷方式,更像是 C 定义语句,而不是必须声明委托类型、委托函数然后拥有给所有构造函数中的委托函数赋值?

【问题讨论】:

  • C# 中的大多数集合类型都有一个 Contains 方法,该方法与您在此处所做的完全一样,并且效率更高。您可以在数组上使用 Array.Exists 方法。

标签: vb.net function delegates


【解决方案1】:

您应该能够声明要包含静态类的所有成员,如下所示:

using static Dolphin.modGeneral;

但是,您可能会发现考虑任何现有方法的效率并创建一些新方法很有用。例如:

public static bool IIN(this string value, params string[] values)
{
    return values.Contains(value);
}

【讨论】:

  • 谢谢@Steve。我完全同意你关于效率的观点。不过,using static Dolphin.modGeneral 出现错误,即:“需要标识符;'static' 是关键字”。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多