6

也许这是一个新手问题,但谁能解释一下绑定/链接类(我不知道他们的真名)是如何制作的?例子可以是LINQ TO XML

当我有以下代码时:

XDocument doc = XDocument.Load("...");
XElement element = doc.Element("root");
element.SetAttribute("NewAttribute", "BlahBlah");
doc.Save("...");

我只更改element变量(我不需要更新它,doc因为它被引用了)。如何创建这样的类?

[编辑]
我尝试了@animaonline 的代码,它可以工作

A a = new A();
B b = a.B(0);
b.Name = "asd";
Console.WriteLine(a.Bs[0].Name); // output "asd"

但是告诉上面和下面的代码有什么区别?

List<string> list = new List<string>();
list.Add("test1");
list.Add("test2");
var test = list.FirstOrDefault();
test = "asdasda";
Console.WriteLine(list[0]); // output "test1" - why not "asdasda" if the above example works???
4

3 回答 3

4

doc.Element 是一种方法,它返回对具有指定 XName 的第一个(按文档顺序)子元素的引用。

考虑这个例子:

public class A
{
    public A()
    {
        this.Bs = new List<B>();

        this.Bs.Add(new B { Name = "a", Value = "aaa" });
        this.Bs.Add(new B { Name = "b", Value = "bbb" });
        this.Bs.Add(new B { Name = "c", Value = "ccc" });
    }

    public List<B> Bs { get; set; }

    public B B(int index)
    {
        if (this.Bs != null && this.Bs[index] != null)
            return this.Bs[index];

        return null;
    }
}

public class B
{
    public string Name { get; set; }
    public string Value { get; set; }
}

用法:

A a = new A();
var refToA = a.B(0);
refToA.Value = "Some New Value";

foreach (var bs in a.Bs)
    System.Console.WriteLine(bs.Value);

解释:

如您所见,B() 方法返回对 A 类中列表项的引用,更新它也会更改 A.bs 列表中的值,因为它是同一个对象。

于 2013-08-01T11:55:42.973 回答
1

我明白你在问什么。我的回答的有效性完全基于这个前提。:D


类成员不必是原始类型——它们也可以是其他类。

简单的例子

给定两个类 SimpleXDocument 和 SimpleXElement,请注意 SimpleXDocument 有一个 SimpleXElement 类型的成员/公开属性:

public Class SimpleXDocument
{
    private SimpleXElement _element;
    public SimpleXDocument(){ this._element = null;}
    public SimpleXDocument(SimpleXElement element){this._element = element;}
    public SimpleXElement Element
    {
        get{return this._element;}
        set{this._element = value;}
    }
}

Public Class SimpleXElement
{
    private String _value;
    public SimpleXElement(){this._value = String.Empty;}
    public SimpleXElement(String value){this._value = value;}
    public String Value
    {
        get{return this._value;}
        set{this._value = value;}
    }
}

SimpleXDocument引用它自己的 SimpleXElement 类型的成员。您可以执行以下操作:

SimpleXDocument doc = new SimpleXDocument();
doc.Element = new SimpleXElement("Test 1");
SimpleXElement element = new SimpleXElement();
element.Value = "Test 2";
doc = New SimpleXDocument(element);
SimpleXElement anotherElement = new SimpleXElement("another test");
doc.Element = anotherElement;
doc.Element.Value = "yet another test";
anotherElement.Value = "final test"; //N.B. this will update doc.Element.Value too!
于 2013-08-01T12:12:10.217 回答
-2

据我了解,您不需要对元素的引用,而是在引用后面的对象的副本。

我认为这个答案会帮助你: https ://stackoverflow.com/a/129395/1360411

于 2013-08-01T12:22:06.673 回答