我在这里有一个情况,我需要继承自己的类List<ItemType>,但是当我这样做时,XmlSerializer不会序列化我的类中声明的任何属性或字段,以下示例演示:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DoSerialize();
}
private void DoSerialize()
{
MyClass obj = new MyClass();
obj.Add(1);
obj.Add(2);
obj.Add(3);
XmlSerializer s = new XmlSerializer(typeof(MyClass));
StringWriter sw = new StringWriter();
s.Serialize(sw, obj);
}
}
[Serializable]
[XmlRoot]
public class MyClass : List<int>
{
public MyClass()
{
}
int myAttribute = 2011;
[XmlAttribute]
public int MyAttribute
{
get
{
return myAttribute;
}
set
{
myAttribute = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果XML:
<?xml version="1.0" encoding="utf-16"?> …Run Code Online (Sandbox Code Playgroud) 我是仿制药的新手.我想通过从IList<T>接口派生它来实现我自己的集合.
能否请您提供一些实现IList<T>接口的类的链接,或者为我提供至少实现Add和Remove方法的代码?
我是数据绑定的新手.
我有这些课程:
public class Foo : List<Bar>
{
public string FooName { get; set; }
}
public class Bar
{
public string BarName { get; set; }
public string BarDesc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个 List<Foo>
我想要有Foo物品ComboBox和Bar物品ListBox.当我更改所选项目时ComboBox,我想要ListBox更改.当我更改所选项目时,ListBox我想TextBox填写BarDesc.
下面只对作品ListBox和ComboBox:
comboBox1.DataSource = foos;
comboBox1.DisplayMember = "FooName";
listBox1.DataBindings.Add("DataSource", foos, "");
listBox1.DisplayMember = "BarName";
Run Code Online (Sandbox Code Playgroud)
我现在不如何绑定选择做Bar的ListBox到TextBox.Text财产.也许添加绑定 …
我是C#的相对新手,虽然我是一名称职的程序员,但我承认我对编写自定义集合类是否是一个好主意感到困惑.很多人似乎都说"不要",但在C#中有一整套基类.
这是我的具体案例.我有一个时间表申请.作为其中的一部分,我有一个服务类,服务类包含服务y的集合,例如路由链接.路由链接本身就是一个自定义类:
public class Service
{
public RouteLinks RL; // A collection of RouteLink types
...
}
public class RouteLink
{
public string FirstStopRef;
public string LastStopRef;
public Tracks RouteTrack; // Another collection, this time of Track types
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经看过使用Dictionary作为RouteLinks的类型,因为我需要能够引用它们.原则上这很好.但是,将RouteLink添加到RouteLinks集合的过程包括检查它是否已经存在,或者它是否已扩展和现有的路由链接,或者......为此,我需要一个自定义的添加功能.
那么为什么创建自定义集合类会有这么糟糕的做法呢?为什么我不应该继承CollectionBase或DictionaryBase?
我或许应该补充一点,我从VBA传输此代码[请不要拍我:)]我必须实现自定义集合.
当一个类必须具有某种对象的容器(集合)时,有几种选择,我想知道我会更喜欢哪种实现。
这里遵循我发现的选项:
public class AClass : IEnumerable<string>{
private List<string> values = new List<string>()
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator(){
return values.GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
优点:AClass不依赖于集合的具体实现(在这种情况下为List)。
缺点:AClass没有添加和删除元素的接口
public class AClass : ICollection<string>{
private List<string> values = new List<string>()
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator(){
return values.GetEnumerator();
}
//other ICollectionMembers
}
Run Code Online (Sandbox Code Playgroud)
优点:与IEnumerable相同,并且具有用于添加和删除元素的界面
缺点:ICollection接口定义了其他人很少使用的方法,仅出于接口的目的而实现这些方法就很无聊。IEnumerable LINQ扩展也可以解决其中一些问题。
public class AClass : List<string>{
}
Run Code Online (Sandbox Code Playgroud)
优点:无需执行任何方法。调用方可以调用List实现的任何方法
缺点:AClass依赖于集合列表,如果更改,则可能需要更改某些调用者代码。同样,AClass不能继承任何其他类。
问题是:我更愿意声明我的班级包含一个同时支持添加和删除操作的集合?或其他建议...
[DataContract]
public class A : List<B>
{
[DataMember]
public double TestA { get; set; }
}
[DataContract]
public class B
{
[DataMember]
public double TestB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用上面的模型,我尝试序列化以下对象:
List<A> list = new List<A>()
{
new A() { TestA = 1 },
new A() { TestA = 3 }
};
json = JsonConvert.SerializeObject(list);
//json: [[],[]]
Run Code Online (Sandbox Code Playgroud)
我的两个价值来自TestA哪里?这可能是从这个线程(XML)重复,但我想知道是否没有选项通过设置一些JSON序列化选项来包含这些值?
注意:List<B>在类中创建属性A而不是继承对我来说是没有选择的.
我有一个类继承List<T>并添加了一个类属性
public class DrivenList : List<int>
{
public string Name {get;set;}
private DrivenList() { }
public DrivenList(string name) { this.Nname = name; }
}
Run Code Online (Sandbox Code Playgroud)
当使用 Newtonsoft.Json JSON 序列化对象时,我仅获得列表项。([1,2,3])
有什么想法如何将Name属性添加到结果中吗?
解决:通过将此属性添加到列表中
[JsonObject(MemberSerialization = MemberSerialization.Fields)]
public class DrivenList : List<int>
Run Code Online (Sandbox Code Playgroud) 我有两节课:
public class Row : Dictionary<string,string> {}
public class Table : List<Row> {}
Run Code Online (Sandbox Code Playgroud)
在应该返回Table类型的对象的方法中,我尝试使用Where -Statement过滤Table类型的对象,并在过滤后返回此对象.
Table table = new Table();
table = tableObject.Where(x => x.Value.Equals("")).ToList();
return table;
Run Code Online (Sandbox Code Playgroud)
我的问题是生成的IEnumerable的演员表.
附加信息:无法将'System.Collections.Generic.List`1 [Row]'类型的对象强制转换为'Table'类型.
如何从IEnumerable中返回Table类型的对象?
假设我有一个POCO和一个List类:
class MyClass
{...}
class MyClasses : List<MyClass>
{...}
Run Code Online (Sandbox Code Playgroud)
和以下方法将映射IEnumerable<MyClass>到MyClasses列表:
public static TListType ToListOfType<TListType, TItemType>(this IEnumerable<TItemType> list) where TListType : IList<TItemType>, new()
{
var ret = new TListType();
foreach (var item in list)
{
ret.Add(item);
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我希望此代码可以编译,但不会:
var list = someListOfMyClass.ToListOfType<MyClasses>();
Run Code Online (Sandbox Code Playgroud)
但是我得到了
错误CS1061'IEnumerable'不包含'ToListOfType'的定义,并且找不到可访问的扩展方法'ToListOfType'接受类型为'IEnumerable'的第一个参数(您是否缺少using指令或程序集引用?)
但是,这确实有效:
var list = someListOfMyClass.ToListOfType<MyClasses, MyClass>();
Run Code Online (Sandbox Code Playgroud)
我不明白为什么类型推断不足以使编译器知道项目类型是什么,因为this变量是已知类型的列表。
我有一个模型如下:
public class TestResultModel
{
public bool Successful { get; set; }
public string ErrorMessage { get; set; }
}
public class TestResultListModel : List<TestResultModel>
{
public int TotalTestCases { get { return base.Count; } }
public int TotalSuccessful { get { return base.FindAll(t => t.Successful).Count; } }
}
Run Code Online (Sandbox Code Playgroud)
我TestResultListModel从以下地址返回ApiController:
var testResultListModel = new TestResultListModel();
foreach (var testCaseId in new int[] {1,2,3,4})
{
var testResultModel = new TestResultModel
{
Successful = true,
ErrorMessage = "STRING"
}; …Run Code Online (Sandbox Code Playgroud) c# ×10
collections ×3
json ×3
.net ×1
casting ×1
class ×1
data-binding ×1
generics ×1
ienumerable ×1
ilist ×1
inheritance ×1
json.net ×1
linq ×1
list ×1
winforms ×1