小编Ran*_*dom的帖子

使用Rx(Reactive Extensions)来监视ObservableCollection中的特定项

我有一个ObservableCollection,我需要引用一个特定的项目.如果该项目不存在,我需要通过Reactive Extensions监视它是否/何时出现项目,但在设置语句时需要一些帮助.我仍然不熟悉所有不同的Linq扩展如何工作,所以我不知道如何做到这一点.谁能指出我正确的方向?

为了更好地说明,我需要类似以下内容:

public class myitem :INotifyPropertyChanged
{
    private string _key;
    private string _value;

    public string key
    {
        get { return _key; }
        set { _key = value; NotifyPropertyChanged("key"); }
    }

    public string myvalue
    {
        //proper getter/setter, blah, blah
    }
}

ObservableCollection<myitem> _collection = mycollection;
var x = Observable.FromEvent<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
    h => new NotifyCollectionChangedEventHandler(h),
    h => _collection.CollectionChanged += h,
    h => _collection.CollectionChanged -= h);

string keywaitingfor = "thiskey";
string valuewaitingfor = x.Where(xx => xx.key == keywaitingfor).First().myvalue;
Run Code Online (Sandbox Code Playgroud)

这不完全是我的情景,但希望你能看到我正在尝试做的事情.ObservableCollection可能不包含任何要开始的项目,并且属性值是异步的.我知道最后一行是不对的,我需要在lambda中的类PropertyChanged事件上有一个Observable ...但我仍然对如何在满足两个条件时获得该值等待感到困惑.

c# linq observablecollection system.reactive

12
推荐指数
2
解决办法
7294
查看次数

如何在asp.net mvc 4中使用jquery?

我正在使用ASP.Net 4和MVC的网站上工作.我对WebForms和javascript很熟悉,并且使用过jquery,但捆绑让我感到困惑.据我所知,所有的javascript文件都包含在BundleConfig.cs中,并通过site.master文件中的标题下载.所以,我应该能够将我的附加函数和jquery调用放在新标签中.

但很明显,jquery函数应该进入文件的方式与我习惯的方式完全不同,而且根本无法获得任何操作.

是否有任何简短的教程可以告诉我在MVC中执行此操作的正确方法?而不是Razor,我这里不需要两条学习曲线.

asp.net-mvc jquery

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

如何在html页面上添加水印/叠加图像?

是否有可能以某种方式为具有半透明图像的html页面添加水印,该图像仍然允许用户在其后面的页面上进行交互?矛盾,没有一些复杂的脚本似乎不可能,但也许我错过了一些东西.

html css jquery

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

更好的方法来定义静态方法

我面临着在我的基类上创建一个静态方法的要求,但不喜欢我必须声明类型参数,所以我想知道我是否正确地采用这种方式.

基本上,我正在分配我将与课堂上的属性相关联的代表.我可以轻松地将该方法放在继承的类上,如下所示:

public class Foo 
{
   public string Property1 { get; set; }
}

public class InheritsFoo : Foo 
{
    public void AssignDel<TVal>(
        Expression<Func<InheritsFoo, TVal>> expr, 
        Action<InheritsFoo, TVal> action) 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,在扩展类中,我可以这样做:

public static void AssignDel<T, TVal>(
    this T source, 
    Expression<T, TVal>> expression, 
    Action<T, TVal> action) 
    where T : Foo 
{
}
Run Code Online (Sandbox Code Playgroud)

这两个都可以让我AssignDel在实例化的类中使用:

var foo = new InheritsFoo();
foo.AssignDel(x => x.Property1, handler);
Run Code Online (Sandbox Code Playgroud)

但我要求制作AssignDel静态.这使得扩展方式无用.它仍然有效InheritsFoo,但我真的想把它移到基类.如果我尝试,无法推断泛型参数,我必须更改方法的用法:

InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler);
Run Code Online (Sandbox Code Playgroud)

有没有办法在这里,另一种方式这样做我没有想到?

编辑:在关于扩展方法是否应该工作的评论中解决问题...我去了@Mark M.引用的网址.如果我这样写的话......

InheritsFoo foo …
Run Code Online (Sandbox Code Playgroud)

c# generics lambda extension-methods static

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

我可以创建List <WeakReference <T >>吗?

我正在尝试WeakReference使用4.5泛型实现创建一个s 列表,以便我可以避免类型检查和WeakReference目标的转换.但是,WeakReference<T>似乎不支持协方差,所以我试图建立一个解决方法.

我认为它应该是可行的,因为每个T都是特定继承链中的类型.那么,我在想的就是这样:

public class Animal { }
public class Tiger : Animal { }
public class Wolf : Animal { }

var mylist = new List<WeakReference<Animal>>();

mylist.Add(new WeakReference<Animal>(new Animal()));
mylist.Add(new WeakReference<Tiger>(new Tiger()));
mylist.Add(new WeakReference<Wolf>(new Wolf()));
Run Code Online (Sandbox Code Playgroud)

我已经尝试为WeakReference创建一个包装类(因为它是不可继承的),但这不起作用.无论如何,列表不会接受任何WeakReference其他类型的WeakReference<Animal>.

我可以创建我自己的通用WeakReference实现,但这似乎是打败了这一点,因为我在其中进行类型转换.我找不到任何文档,但我有点假设框架版本更好地处理这个问题.

有没有另外一种方法可以解决这个问题,我没想到,或者我是在咆哮错误的树?

c# generics weak-references

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

Silverlight项目不会进入调试模式

我在VS 2010中的Silverlight项目已停止进入调试模式.即使我在Application类的构造函数中设置了断点,它也拒绝遇到任何断点.我的其他项目仍然很好,但我找不到任何可能意外更改的设置,以防止我调试.会发生什么事?

silverlight visual-studio-2010 visual-studio-debugging

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

如何将函数返回值编组到非托管dll

我有一个用C#编写的dll,并且暴露给COM.我在构建器中使用dll ...我可以实例化该类,但是在编译C#方法调用的返回值时遇到了问题.

C#

public string GetValue([MarshalAs(UnmanagedType.LPWStr)] string key)
{
   return "value";
}
Run Code Online (Sandbox Code Playgroud)

导入到构建器中的已翻译函数:

virtual HRESULT STDMETHODCALLTYPE GetValue(LPWSTR key/*[in]*/, 
                                           BSTR* pRetVal/*[out,retval]*/) = 0;
Run Code Online (Sandbox Code Playgroud)

我对C++知之甚少.'key'参数传递得很好,因为我能够在参数上使用'MarshalAs'属性,但我要么不知道如何为返回值声明它,要么不知道如何调用在C++方面的功能(我尝试了几件事,只是猜测).

更新:好的,我只是通过采取Anton的例子并根据Hans的评论尝试修改来解决问题.Antons的回答正如他所展示的那样,但由于对内存管理问题的关注,我最终没有在C#中应用return属性,而C++代码调用函数如下:

BSTR result;
obj->GetValue(key, &result);
SysFreeString(key);
SysFreeString(result);
Run Code Online (Sandbox Code Playgroud)

我希望我可以赞扬这两个答案,帮助我解决这个问题,他们都必须向我提供我需要的信息.

c# c++ com com-interop marshalling

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