Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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# 使或声明ObservableCollection变量为全局变量,其中a=匿名类型_C#_Observablecollection_Datacontext - Fatal编程技术网

C# 使或声明ObservableCollection变量为全局变量,其中a=匿名类型

C# 使或声明ObservableCollection变量为全局变量,其中a=匿名类型,c#,observablecollection,datacontext,C#,Observablecollection,Datacontext,我想将listview datacontext设置为一个可观察的集合,以便集合的更改可以反映在我的listview上。我创建的可观察集合如下所示: public static ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> enumeration) { return new ObservableCollection<T>(enumeration); } p

我想将listview datacontext设置为一个可观察的集合,以便集合的更改可以反映在我的listview上。我创建的可观察集合如下所示:

public static ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> enumeration)
{
     return new ObservableCollection<T>(enumeration);
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{

           Entities.DatabaseModel m = new Entities.DatabaseModel();
           var q = from t in m.TimeSheet                            
                    join emp in m.Employees on t.idEmployee equals emp.id
                    where emp.id == CurrentEmploye.id
                    select new
                    {
                        firstName = emp.firstName,
                        lastName = emp.lastName,
                        position = emp.position,
                        clockInDate = t.clockInDate,
                        clockOutDate = t.clockOutDate,
                    };
           // here I create the observablecollection!!!!!!!!!!!!!!
           listView1.DataContext = ToObservableCollection(q); 
}
这是我尝试过的,但不起作用:

    dynamic collection; 


private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
       // CurrentEmploye some employee
       Entities.DatabaseModel m = new Entities.DatabaseModel();
       var q = from t in m.TimeSheet                            
                join emp in m.Employees on t.idEmployee equals emp.id
                where emp.id == CurrentEmploye.id
                select new
                {
                    firstName = emp.firstName,
                    lastName = emp.lastName,
                    position = emp.position,
                    clockInDate = t.clockInDate,
                    clockOutDate = t.clockOutDate,
                };

       collection = ToObservableCollection(q); 
 }


    private void btnClockIn_Click(object sender, RoutedEventArgs e)
    {

         collection.Add(new
                {
                    firstName = "Antonio",
                    lastName = "Nam",
                    position = "Amin",
                    clockInDate = DateTime.Now,
                    clockOutDate = DateTime.Now
                });

您可以使用类似的“模板”匿名变量来“欺骗”它。。。 e、 代码方法类似于

static ObservableCollection<T> CastToEnumerable<T>(this T template, object value)
{
    return (ObservableCollection<T>)value;
}
…出于您的目的,仍然建议使用普通的命名类。 你可以在这里找到更多关于类似问题的信息。。。
基本上,你不能返回匿名类型——除了像这样的技巧之外——“推断”类型就是背后的原因

您可以使用类似的“模板”匿名变量来“欺骗”它。。。 e、 代码方法类似于

static ObservableCollection<T> CastToEnumerable<T>(this T template, object value)
{
    return (ObservableCollection<T>)value;
}
…出于您的目的,仍然建议使用普通的命名类。 你可以在这里找到更多关于类似问题的信息。。。
基本上,你不能返回匿名类型——除了像这样的技巧之外——“推断”类型就是背后的原因

在不能使用类型推断的地方使用匿名类型是不可能的,因此,例如,不能声明匿名类型的类字段或属性。然而,有一种不明显的方法是使用类型推断,它允许您跨方法共享匿名对象

正如我在评论中提到的,最简单的选择是只使用命名类型;这将允许您将ObservableCollection定义为类级变量,或在类中的其他位置对DataContext进行类型转换

根据您需要使用此代码的频率,还有第二个选项涉及将对象类型转换为匿名类型。这要求您知道,在每个要使用匿名类型的地方,它的字段顺序是什么。它还要求匿名类型的每次使用都存在于同一程序集中——这保证了编译器将匿名类型统一到一个底层类型中

如果符合您的要求,您可以使用以下技巧:

ObservableCollection<T> Cast<T>(object obj, T typedobj)
{
  return (ObservableCollection<T>)obj;
}

private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
  var temp = new 
  { 
    firstName = string.Empty, 
    lastName = string.Empty, 
    position = string.Empty, 
    clockInDate = DateTime.Min, 
    clockOutDate = DateTime.Now 
  };

  var collection = Cast(lstView1.DataContext, temp);
  collection.Add(...);
}

让我重复一遍,这是一个有点混乱的技巧,它利用了C如何实现匿名类型的一个模糊细节。这本身并不是一个黑客行为,因为行为是由规范保证的,但这在多大程度上是有严格限制的。如果您只有一个或两个这样的集合,我肯定会倾向于给您的类型命名。

在无法使用类型推断的地方使用匿名类型是不可能的,因此您不能(例如)声明匿名类型的类字段或属性。然而,有一种不明显的方法是使用类型推断,它允许您跨方法共享匿名对象

正如我在评论中提到的,最简单的选择是只使用命名类型;这将允许您将ObservableCollection定义为类级变量,或在类中的其他位置对DataContext进行类型转换

根据您需要使用此代码的频率,还有第二个选项涉及将对象类型转换为匿名类型。这要求您知道,在每个要使用匿名类型的地方,它的字段顺序是什么。它还要求匿名类型的每次使用都存在于同一程序集中——这保证了编译器将匿名类型统一到一个底层类型中

如果符合您的要求,您可以使用以下技巧:

ObservableCollection<T> Cast<T>(object obj, T typedobj)
{
  return (ObservableCollection<T>)obj;
}

private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
  var temp = new 
  { 
    firstName = string.Empty, 
    lastName = string.Empty, 
    position = string.Empty, 
    clockInDate = DateTime.Min, 
    clockOutDate = DateTime.Now 
  };

  var collection = Cast(lstView1.DataContext, temp);
  collection.Add(...);
}

让我重复一遍,这是一个有点混乱的技巧,它利用了C如何实现匿名类型的一个模糊细节。这本身并不是一个黑客行为,因为行为是由规范保证的,但这在多大程度上是有严格限制的。如果你只有一两个这样的集合,我肯定会倾向于给你的类型命名。

你真的需要匿名类型吗?查询是否会返回与您指定的字段不同的字段?您是对的,我只是想节省时间,因为我在其他地方需要此功能,但最终可能会浪费更多时间。您有一些选项,使用命名类型是最快的。我将发布一个更详细的答案。可能是的副本。你绝对需要匿名类型吗?查询是否会返回与您指定的字段不同的字段?您是对的,我只是想节省时间,因为我在其他地方需要此功能,但最终可能会浪费更多时间。您有一些选项,使用命名类型是最快的。我将发布一个更详细的答案。该方法可能重复:ObservableCollection Castobject obj,T typedobj给我一个编译错误,上面说:无法将类型“T”转换为“System.Collections.ObjectModel.ObservableCollectionyeah,我的答案中有输入错误,抱歉。键入错误的参数。现在已修复。虽然我更喜欢扩展方法版本:只是风格问题:我不会仅仅因为这个就发布我的答案,但我们会
几乎是在同一时间,这仍然是一个'黑客',无论我们怎么说,更有趣的编码不知道;C规范明确保证了这一点,这使得我更可能使用它,而不是依赖GetHashCode的实现。方法:ObservableCollection Castobject obj,T typedobj给我一个编译错误,说:无法将类型“T”转换为“System.Collections.ObjectModel.ObservableCollectionyeah,对不起,我的答案错了。键入错误的参数。现在修复了。虽然我更喜欢扩展方法版本:只是风格问题:我不会仅仅因为这个就发布我的答案,但我们几乎同时发布了——不管我们怎么说,这仍然是一个“黑客”,更有趣的编码我不知道;C规范明确保证了这一点,这一事实使我更有可能使用它,比如说,依赖GetHashCode的实现,我没有意识到可以向泛型类型添加扩展方法,这太棒了。你可以用静态方法做任何你能做的事情,你可以使方法与类一样通用-只需在第一个参数中添加“this”-虽然有点简化。没有意识到你可以将扩展方法添加到泛型类型中,这太棒了。你可以用静态方法做任何你能做的事情,你可以让方法和类一样通用——只需在第一个参数中加上“this”——虽然有点简化。