2

いくつかのプロパティを持つ がobjectあり、それらのプロパティのいくつかはListsです。各リストには、他のクラスのインスタンスが含まれています。私がやりたいことは、リストから最初の項目を取得し、それらのプロパティ値を上書きすることです。

これが私が持っているものの疑似例です:

public class User
{
    public List<Address> Addresses = new List<Address>();

    public User ( )
    {
        Addresses = fill with data;
    }
}


public class TestUser
{
    public User user; // Is filled somewhere in this class

    public void TestUpdateList ( Address addr )
    {
        // The param "addr" contains new values
        // These values must ALWAYS be placed in the first item
        // of the "Addresses" list.

        // Get the first Address object and overwrite that with
        // the new "addr" object
        user.Addresses[0] = addr; // <-- doesn't work, but should give you an idea
    }
}

この例が、私がやりたいことを明らかにしてくれることを願っています。

だから私は基本的にリスト内の既存のアイテムを「更新」する方法を探していobjectます。

4

4 に答える 4

0
public void TestUpdateList ( User user, Address addr )
    {
        // The param "addr" contains new values
        // These values must ALWAYS be placed in the first item
        // of the "Addresses" list.

        // Get the first Address object and overwrite that with
        // the new "addr" object
        user.Addresses[0] = addr; // <-- doesn't work, but should give you an idea
    }
于 2012-10-29T11:40:40.227 に答える
0

Addressesクラス名を介してプロパティにアクセスしているため、例はコンパイルされません。それが静的である場合にのみ可能です。したがって、ユーザーのアドレスを更新するには、最初にユーザーのインスタンスが必要です。

User u = new User(userID); // assuming that theres a constructor that takes an identifier
u.Addresses[0] = addr;

C#言語仕様:10.2.5静的メンバーとインスタンスメンバー

于 2012-10-29T11:26:46.397 に答える
0

何を達成しようとしているのかは完全には明確ではありませんが、次のコードを参照してください。アドレス、ユーザー、およびユーザーの最初のアドレスを特定の値に置き換えるFeatureXというユーティリティがあります。

class Address {
    public string Street { get; set; }
}

class User {
    public List<Address> Addresses = new List<Address>();
}

class FeatureX {
    public void UpdateUserWithAddress(User user, Address address) {
        if (user.Addresses.Count > 0) {
            user.Addresses[0] = address;
        } else {
            user.Addresses.Add(address);
        }
    }
}

次の使用法では、「Xyz」が2回出力されます。

User o = new User();
Address a = new Address() { Street = "Xyz" };

new FeatureX().UpdateUserWithAddress(o, a);
Console.WriteLine(o.Addresses[0].Street);

o = new User();
o.Addresses.Add(new Address { Street = "jjj" });
new FeatureX().UpdateUserWithAddress(o, a);
Console.WriteLine(o.Addresses[0].Street);

DLLをサードパーティと共有する場合、パブリックフィールドは多くの問題を引き起こす可能性があることに注意してください。

于 2012-10-29T11:28:20.273 に答える
0

問題は Addresses がプライベート フィールドであることだと思います。

これは機能します:

[TestFixture]
public class ListTest
{
    [Test]
    public void UpdateTest()
    {
        var user = new User();
        user.Addresses.Add(new Address{Name = "Johan"});
        user.Addresses[0] = new Address { Name = "w00" };
    }
}
public class User
{
    public List<Address> Addresses { get;private  set; }

    public User()
    {
        Addresses= new List<Address>();
    }
}
public class Address
{
    public string Name { get; set; }
}
于 2012-10-29T11:31:24.217 に答える