Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中将操作传递给抽象父类?_C# - Fatal编程技术网

如何在C#中将操作传递给抽象父类?

如何在C#中将操作传递给抽象父类?,c#,C#,一个基本的新手问题 我试图在编辑字符串时执行一个操作,但我无法理解它。该操作在调用类中定义,但由继承的基类使用。只有调用类可以访问Strings observablecollection,但是继承的基类知道是否对原始svm执行了编辑 请帮忙 我正试图做这样的事却没有成功。在召唤课上 foreach (View_rx rx in rxs) { StringByColumnViewModel svm = new StringByColumnViewModel(stuff,

一个基本的新手问题

我试图在编辑字符串时执行一个操作,但我无法理解它。该操作在调用类中定义,但由继承的基类使用。只有调用类可以访问Strings observablecollection,但是继承的基类知道是否对原始svm执行了编辑

请帮忙

我正试图做这样的事却没有成功。在召唤课上

 foreach (View_rx rx in rxs)
 {
    StringByColumnViewModel svm = new StringByColumnViewModel(stuff,
                    p => {
                        var oldPos = this.Strings.IndexOf(svm);  <--This is wrong
                        this.Strings.RemoveAt(oldPos);
                        this.Strings.Insert(oldPos, ???);
                    });

   Strings.Add(svm);                                       
 }
我希望在创建svm时传递要执行的操作someaction,以便在基类中的lambda表达式为true时执行该操作。要执行的操作是从字符串中删除当前svm,并用另一个svm替换它。所以问题是传递一个lamda表达式供另一个使用


有什么想法吗?还是这种方法完全错了?谢谢。

因此,如果我是正确的,您正在尝试找出如何将操作传递给对象的构造函数,该操作应在对象的
OnEdit
事件被激发时执行,但该操作需要保留对修改对象本身的引用。要立即解决问题,只需更改第一个代码示例,这样它就不需要词法范围中的
svm
,而是需要通过参数传入的视图模型,如下所示

 foreach (View_rx rx in rxs)
 {
    StringByColumnViewModel svm = new StringByColumnViewModel(stuff,
                    stringByColViewModel, presenterViewModel => {
                        var oldPos = this.Strings.IndexOf(stringByColViewModel);  <--This is wrong
                        this.Strings.RemoveAt(oldPos);
                        this.Strings.Insert(oldPos, ???);
                    });

   Strings.Add(svm);                                       
 }

 public class StringByColumnViewModel
 {
     public StringByColumnViewModel(Action<StringByColumnViewModelBase> onEdit) : base(onEdit)
     }
 }
foreach(var rx in rxs)
{
    var viewModel = new StringByColumnViewModel(stuff);
    // You could use either IObserver<T> or standard .NET events here
    // I'm using IObserver<T> because you can use interesting libraries
    // with it (namely Reactive Extensions) but both uses are valid
    viewModel.Edited.Subscribe(stringByColViewModel => OnHandleEdit(stringByColViewModel));
    Strings.Add(viewModel);
}

protected void OnHandleEdit(StringByColViewModel stringByColViewModel)
{
    var position = Strings.IndexOf(stringByColViewModel);
    Strings.RemoveAt(position);
    Strings.Insert(position, stringByColViewModel);
}
尽管据我所知,它毫无价值,但您不需要从
Strings
中删除/插入,因为
StringByColumnViewModel
是一种引用类型。
StringByColumnViewModel
Strings
上的任何更改都将已经知道,因为它包含对
StringByColumnViewModel
实例的引用


如果您继续使用
Strings
修改方法,请务必注意并发问题。

我想知道您在这里停留的是什么部分-调用
onEdit
还是调用
onEdit
之后的操作?考虑执行<代码> iVistabue<代码>界面,而不是试图用抽象基类做一些魔术。不清楚。很难说是怎么回事。你能为你正在尝试做的事情创建一个最小的、正确的例子吗?我只是没有看到它隐藏在所有的生产代码中。@Will本质上,我试图提供调用类要执行的操作,以替换/成为抽象类StringViewModelBase中当HasValue&&Value为true时执行的OneEdit操作。无法获取语法。@理想情况下,我想用调用类指定的操作替换“onEdit”。但我只是试图在调用类中保留字符串。@DanPantry为了清晰起见,我修改了这个问题(我希望如此)。谢谢。非常感谢您的时间和指导。这太棒了!很好。请注意,如果没有安装ReactiveExtensions,我的observer示例可能不起作用
IObserver
是CLR的一部分,但是扩展方法
IObserver.Subscribe(Action)
不是。只是从nugget安装了ReactiveExtensions。如何定义“已编辑”扩展名?谢谢
StringByColumnViewModel svm = new StringByColumnViewModel( someaction);
 foreach (View_rx rx in rxs)
 {
    StringByColumnViewModel svm = new StringByColumnViewModel(stuff,
                    stringByColViewModel, presenterViewModel => {
                        var oldPos = this.Strings.IndexOf(stringByColViewModel);  <--This is wrong
                        this.Strings.RemoveAt(oldPos);
                        this.Strings.Insert(oldPos, ???);
                    });

   Strings.Add(svm);                                       
 }

 public class StringByColumnViewModel
 {
     public StringByColumnViewModel(Action<StringByColumnViewModelBase> onEdit) : base(onEdit)
     }
 }
foreach(var rx in rxs)
{
    var viewModel = new StringByColumnViewModel(stuff);
    // You could use either IObserver<T> or standard .NET events here
    // I'm using IObserver<T> because you can use interesting libraries
    // with it (namely Reactive Extensions) but both uses are valid
    viewModel.Edited.Subscribe(stringByColViewModel => OnHandleEdit(stringByColViewModel));
    Strings.Add(viewModel);
}

protected void OnHandleEdit(StringByColViewModel stringByColViewModel)
{
    var position = Strings.IndexOf(stringByColViewModel);
    Strings.RemoveAt(position);
    Strings.Insert(position, stringByColViewModel);
}