小编Eri*_*ric的帖子

使用不同的事件处理程序委托为多个控件实现单个事件处理程序

我有一个函数,void Validate()它包含窗口的所有验证逻辑.

我不能简单地将其注册为事件处理程序,因为它不接受事件处理程序委托所需的参数.另外,不同类型的控件具有不同的签名,因此我不能只Validate匹配一个签名而忽略其内容.

这是我设置的一个小例子

    txt1.TextChanged += Validate_TextChange;
    password1.PasswordChanged += Validate_RoutedEvent;
    txt2.TextChanged += Validate_TextChange;

    txt3.TextChanged += Validate_TextChange;
    password2.PasswordChanged += Validate_RoutedEvent;
    txt4.TextChanged += Validate_TextChange;


void Validate_RoutedEvent(object sender, RoutedEventArgs e)
{
    ValidateOptions();
}

void Validate_TextChange(object sender, TextChangedEventArgs e)
{
    ValidateOptions();
}

public void ValidateOptions()
{
   //Actual validation here
}
Run Code Online (Sandbox Code Playgroud)

这仅显示了2个示例,更多控件可能具有更多签名.在我不关心传递的参数的情况下,有没有更好的方法让所有事件处理程序调用函数?


编辑:我喜欢Jon提出的添加参数的选项,只是忽略它们.这确实解决了大部分问题,但是任何时候我想直接调用这个函数,比如手动触发验证,然后我必须包含伪参数来满足编译器.ValidateOptions(this,new EventArgs())

Dan建议使用匿名函数来处理这个问题,但在关联事件处理程序时并不是那么干净.

似乎任何解决方案都不允许您将函数注册为事件处理程序而忽略签名,同时还保留调用函数的能力而不创建伪参数,但有多种方法可以非常接近.


编辑:

以下是实现Jon的通用事件处理解决方案的更新示例,但保留了可以直接调用的0参数函数

txt1.TextChanged += ValidationEvent;
password1.PasswordChanged += ValidationEvent;
txt2.TextChanged += ValidationEvent;

txt3.TextChanged += ValidationEvent;
password2.PasswordChanged += ValidationEvent;
txt4.TextChanged += ValidationEvent;


//Single event handler accepting EventArgs, …
Run Code Online (Sandbox Code Playgroud)

c# validation wpf event-handling

6
推荐指数
2
解决办法
3267
查看次数

导出python模块(到字符串或py文件)

摘要: 我想使用“模块”类型的变量并将其导出。

我正在使用import从.py文件中导入 python模块并对其进行更改。我需要将模块导出回文件或获取完整模块的字符串表示形式,然后可以将其写入磁盘。

我一直找不到任何方法可以导出python模块,也无法将模块内的对象转换为结构化,纯文本python可执行格式的字符串。(不是json,腌制等)

详细的问题和用例: 此要求是内部构建过程的一部分;没有安全要求,仅修改了我们自己的模块,而不是内置模块。python脚本与业务逻辑一起运行以修改许多其他脚本。此过程使用仅在构建时可用的信息。结果,我无法选择在运行时导入具有不同数据的模块。

最初的系统使用了带有占位符字符串的模板,该模板将被替换,但是当前的要求要求对对象声明进行更复杂的修改,其中以编程方式修改对象比替换字符串要容易得多。

我所做的事情 使用python编写的主生成器脚本,我可以导入多个模块(它们只有变量声明,没有可执行代码),并进行所有需要的替换。我剩下一个模块类型的变量,我需要将其导出回文件以供以后执行。

@abarnert有一些好主意。我不知道repr功能。那给了我信息,但没有任何格式。这使我看到了pprint,它与到目前为止我所想要的接近。

示例 example.py

    sample = {
    'level1_dict_1' : {
        'key1' : 'value1',
        'key2' : {
            'level2_dict' : {
                'key1' : 'value3',
                'key2' : ['list1','list2','list3','list4'],
            }
        }
    },
    'level1_dict_2' : {
        'key1' : 'value1',
        'key2' : 'value2',
    },
}
Run Code Online (Sandbox Code Playgroud)

大大简化了(并且没有应用任何业务逻辑),我基本上想执行以下操作:

with open("example.py","w") as outfile:
    example = __import__('example') # Import module 
    example.sample['level1_dict_1']['key2']['level2_dict']['key2'][2] = "newlistitem3"  # Change 1 property in a list nested a few levels deep
    outfile.write("sample = \n" …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
3569
查看次数

使用 Powershell -encodedcommand 传递参数

我试图找到一种将参数传递给 powershell 脚本的优雅方式,其中字符串可以包含任意数量的需要转义的特殊字符。例如,带有特殊字符的复杂密码。

我正在查看 -encodedcommand 选项,但似乎这只是为了传递编码的脚本块,而不是参数的编码版本。

例如,考虑以下脚本:

param(
[Parameter()][Alias("un")][string]$Username,
[Parameter()][Alias("pw")][string]$Password
)

Write-Host "Username: $Username"
Write-Host "Password: $Password"
Run Code Online (Sandbox Code Playgroud)

字符串'-un testuser -pw testpw'是base64编码如下:LQB1AG4AIAB0AGUAcwB0AHUAcwBlAHIAIAAtAHAAdwAgAHQAZQBzAHQAcAB3AA==

我尝试将脚本作为 .ps1 文件调用并使用上述字符串传递 -encodedcommand 但得到错误'找不到与参数名称'encodedcommand'匹配的参数

所以,很好,这必须是直接调用 powershell.exe。

还尝试了以下操作:powershell.exe -encodedcommand LQB1AG4AIAB0AGUAcwB0AHUAcwBlAHIAIAAtAHAAdwAgAHQAZQBzAHQAcAB3AA== -file Base64ParamTest.ps1

这运行了脚本,但参数没有值。

这是我所期望的行为,但不是我所希望的。有没有办法将我的参数本身作为安全编码的字符串实际传递?

parameters powershell command-line-arguments

4
推荐指数
1
解决办法
2万
查看次数

循环中的Powershell值会丢失其值

原谅标题,我不确定如何解释我所看到的.

示例代码:

    $SampleValues = 1..5
    $Result = "" | Select ID
    $Results = @()  

    $SampleValues | %{
        $Result.ID = $_
        $Results += $Result
    }

$Results
Run Code Online (Sandbox Code Playgroud)

这很简单:

  • 创建一个包含5个数字的数组,以便在循环中使用
  • 使用名为ID的NoteProperty创建临时变量
  • 创建一个空数组来存储结果
  • 迭代5个数字中的每个数字,将它们分配给临时变量,然后将其附加到数组中.

预期结果是1,2,3,4,5,但运行时返回5,5,5,5,5

这是一个来自更复杂的脚本的准系统示例,我试图弄清楚为什么结果是这样的.在每次迭代中,已添加到$ Results的所有元素都将其值更新为最新值.我已经测试了强制所有内容到$ Script:或$ Global:scope并获得相同的结果.

我发现的唯一解决方案是将$ Result声明移动到循环中.

    $SampleValues = 1..5
    $Results = @()

$SampleValues | %{
    $Result = "" | Select ID
    $Result.ID = $_
    $Results += $Result
    }
Run Code Online (Sandbox Code Playgroud)

这有效(你得到1,2,3,4,5作为你的结果).它看起来像$ Results只是持有多个对单个$ Result对象的引用,但是为什么将它移动到循环中可以解决问题呢?在这个例子中,$ Result是一个字符串,所以也许每次迭代都会创建一个新对象,但即使我强制$ Result为一个整数(由于整数不像字符串那样不可变,因此不应该重新创建一个新对象)仍然解决了问题,我得到了我期望的结果.

如果有人对这个解决问题的确切原因有任何了解,我会非常好奇.我有很多替代方案可以实现,但没有明确理解为什么这种方式有效,这让我烦恼.

powershell

3
推荐指数
1
解决办法
3580
查看次数

XSLT xsl:排序失败,数字大,data-type ="number"

我讨厌甚至问这个,因为有很多关于xsl:sort功能的例子,但是我已经跟着他们而且仍然,莫名其妙地,卡住了.

我在for-each中有一种,似乎是要求.然后,我希望获取所有已排序的数据并应用模板.

这是一个示例XML.我有一组日志元素和结果元素,在不同的路径上,我需要根据数字时间戳值一起排序.在这个例子中,除了最后一个datatimestamp值大于三个结果元素的元素之外,一切都已经自然地排序了,这意味着它应该出现在输出的最后.如上所述,输出将按照它们在输入XML中出现的顺序显示所有日志元素,后跟所有结果元素.

<output>
  <logs>
    <log logtext="Username = " loglevel="DEBUG" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428014" />
    <log logtext="Password = " loglevel="DEBUG" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428027" />
    <log logtext="ServerURI = " loglevel="DEBUG" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428042" />
    <log logtext="TRACE TEST" loglevel="TRACE" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428084" />
    <log logtext="DEBUG TEST" loglevel="DEBUG" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428096" />
    <log logtext="INFO TEST" loglevel="INFO" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428109" />
    <log logtext="WARNING TEST" loglevel="WARN" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428120" />
    <log logtext="ERROR TEST" loglevel="ERROR" timestamp="1/23/2012 5:04:28 PM" numerictimestamp="20120123170428133" /> …
Run Code Online (Sandbox Code Playgroud)

xslt

1
推荐指数
1
解决办法
1319
查看次数