我想创建一个对象的新实例 IEnumerable<object>
我可以这样做吗?
IEnumerable<object> a = new IEnumerable<object>();
Run Code Online (Sandbox Code Playgroud) 我今天遇到了以下问题,我想知道我的问题是否有解决方案.
我的想法是构建匿名类并将其用作WinForm BindingSource的数据源:
public void Init()
{
var option1 = new
{
Id = TemplateAction.Update,
Option = "Update the Templates",
Description = "Bla bla 1."
};
var option2 = new
{
Id = TemplateAction.Download,
Option = "Download the Templates",
Description = "Bla bla 2."
};
var list = new[] {option1, option2}.ToList();
bsOptions.DataSource = list; // my BindingSource
// cboTemplates is a ComboBox
cboTemplates.DataSource = bsOptions;
cboTemplates.ValueMember = "Id";
cboTemplates.DisplayMember = "Option";
lblInfoTemplates.DataBindings.Add("Text", bsOptions, "Description");
}
Run Code Online (Sandbox Code Playgroud)
到目前为止工作正常.
我遇到的问题是从BindingSource的"Current"属性中获取Id,因为我无法将其强制转换为匿名类型:
private void cmdOK_Click(object …Run Code Online (Sandbox Code Playgroud) 我有两个接口:
interface A {
void foo();
}
interface B {
void bar();
}
Run Code Online (Sandbox Code Playgroud)
我能够创建实现这些接口之一的类的匿名实例,如下所示:
new A() {
void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
要么:
new B() {
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个实现两个接口的匿名类.像(虚构的):
new A implements B {
void foo() {}
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
这显然会产生编译错误:"B无法解析为类型".
解决方法很简单:
class Aggregate implements A, B {
void foo() {}
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
然后Aggregate,我会使用匿名类.
我想知道一个匿名类实现两个接口是否合法.
在Java中,可以使用可以动态实现的匿名类扩展接口.例:
Runnable myRunnable = new Runnable()
{
@Override
public void run() { /**/ }
}
Run Code Online (Sandbox Code Playgroud)
(更多信息:http://www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO)
这可能在C#中吗?如果没有,什么是可行的替代方案,而不必依赖于实现过多的子类?
我试图将用java编写的SDK移植到C#.
在这个软件中有许多"处理程序"接口,有几种方法(例如:attemptSomethingHandler有success()几种不同的故障方法).然后在调用类中匿名实现和实例化该接口,并将其传递给类的attemptSomething方法SomethingModel.这是一个异步方法,有几个地方可能会失败或调用另一个方法(传递处理程序).这样,匿名实现attemptSomethingHandler可以在调用的类中引用私有方法attemptSomething.
在C#中,不可能匿名实现接口.我可以显式地实现一个新类,但是这个实现对于这个调用类来说是唯一的,而不是用于其他任何东西.更重要的是,我无法访问调用类中的私有方法,这是我需要的,也不想公开.
基本上,我需要根据SomethingModel类方法中发生的事情从调用类中运行不同的代码.
我一直在阅读代理,但这需要传递尽可能多的委托,因为处理程序界面中有方法(据我所知).在C#中执行此操作的适当方法是什么?我觉得我错过了一个非常常见的编程策略.必须有一种简单,干净的方式来构建和解决这个问题.
我在方法中有以下代码:
var list = new[]
{
new { Name = "Red", IsSelected = true },
new { Name = "Green", IsSelected = false },
new { Name = "Blue", IsSelected = false },
};
Run Code Online (Sandbox Code Playgroud)
我想调用一个函数,它需要一个元素列表,每个元素实现一个接口(ISelectable).我知道如何使用普通类完成此操作,但在这种情况下,我只是尝试填写一些演示数据.
是否可以创建实现接口的匿名类?
像这样:
new { Name = "Red", IsSelected = true } : ISelectable
Run Code Online (Sandbox Code Playgroud) 要么我缺少某些东西,要么.NET不支持Java的功能.我希望能够避免创建一个小类只是为了实现一个小接口.例如,LINQ的Except方法需要IEqualityComparer.所以我不得不写一个实现接口的小类.但是在Java中我可以简单地new IEqualityComparer() { //interface declarations }完成它并完成它.所以有什么问题?
这与这篇文章有些相关:
附加:此刻,我为Equals和添加了覆盖GetHashCode.
在一些类方法中,A,我需要调用一个库方法B,它IProgress<Object>作为一个参数.
通常,我可以实现IProgress<Object>作为A所在的类的一部分,然后将"this"传递给方法B.或者我可能创建一个新类,其唯一目的是IProgress<Object>正确实现和处理它 - 然后在这种情况下我' d创建该类的实例并将其传递给B.
但我真正想要的是让我的实现IProgress<Object>出现在我调用B的方法中,这样调用代码和IProgress<Object>实现之间的视觉断开就更少了.(我认为我对IProgress的实现是一种私有的,非共享的调用方法细节,因此我不希望我的实现IProgress<Object>在一个完全独立的方法中,也许是整个其他类).
我一直在尝试做的是使用一个lambda,我将在其中定义我的简短进度处理,然后以某种方式将这个lambda传递给B,如下所示:
method in class A {
...
Action<Object> Report = (m) => { // do something useful with m };
B(Report)
}
method B(IProgress<Object> reporter) {
reporter.Report(some object)
}
Run Code Online (Sandbox Code Playgroud)
当然,我知道为什么这不会按原样运行--B想要一个实现的对象,IProgress<Object>而是将它交给一个Action对象.
有没有办法实现我想要实现的目标?(IE有我的实现,如果IProgress<Object>出现在方法A中?
我可以用类似的方式创建接口的匿名实现
delegate() { // type impl here , but not implementing any interface}
Run Code Online (Sandbox Code Playgroud)
有点像的东西
new IInterface() { // interface methods impl here }
Run Code Online (Sandbox Code Playgroud)
我认为它们有用的情况是指定作为接口类型的方法参数,并且创建类类型的代码太多.
例如,考虑这样:
public void RunTest()
{
Cleanup(delegate() { return "hello from anonymous type"; });
}
private void Cleanup(GetString obj)
{
Console.WriteLine("str from delegate " + obj());
}
delegate string GetString();
Run Code Online (Sandbox Code Playgroud)
如果在上面的代码中,清理方法将接口作为参数,而不编写类定义,将如何实现?(我认为Java允许表达式像新的Interface()...)
我最近开始使用C#,并且我想找到与此等效的方法。我不知道这叫什么,所以我将简单地通过代码向您展示。
使用Java,我能够创建如下接口:
public interface Event {
public void execute();
}
Run Code Online (Sandbox Code Playgroud)
并在方法的参数中传递此接口,如下所示:
public class TestEvent {
ArrayList<Event> eventList = new ArrayList<Event>();
public void addEvent(Event event){
eventList.add(event);
}
public void simulateEvent(){
addEvent(new Event() {
public void execute(){
//functionality
}
} );
}
public void processEvents(){
for(Event event : eventList)
eventList.execute();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我的问题是关于类中的simulatEvent方法的TestEvent,如果使用C#可以进行这样的操作。
我想知道是否有一种方法可以使用C#执行类似的操作(实例化simulateEvent方法中的接口),以及这实际上是什么。谢谢!
我想知道是否有一些内联短方法来创建实现接口的类。就像有匿名方法但有实现接口一样。
问题是:
interface iSomeInterface
{
void DoIt();
}
public void myMethod(iSomeInterface param)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我想这样使用它:
object.myMethod(new { override DoIt() { Console.WriteLine("yay"); } } : iSomeInterface);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
抱歉,以防重复。
我正在尝试将具有相同属性的匿名类型强制转换为接口,但出现错误:
无法将类型为“ <> f__AnonymousType104`1 [System.Int32]”的对象强制转换为类型为“ IHasFiles”的对象。
public interface IHasFiles
{
int FileMasterId { get; }
}
var entity = new { FileMasterId = fileMasterId }.CastOrDefault<IHasFiles>();
// This is the line where I get the error
Run Code Online (Sandbox Code Playgroud)