2

I want to access the Structures returned by a function in a List. I am not able to do it as it is causing Compiler errors.

public class StructTypeA
{
        public string sString1;
        public string sString2;
}
public class StructTypeB
{
        public int iNum1;
        public int iNum2;
}

public List<object> myFunction ()
{

        StructTypeA myStructA = new StructTypeA();
        StructTypeB myStructB = new StructTypeB();

        var response = new List<object> { new {oStructA = myStructA} , new {oStructB = myStructB } };

            return response;
}

public void myCallerFunction()
{
    var retVal = myFunction ();

//This does not work, it generates a compile error
// 'object' does not contain a definition for 'oStructA' and no extension method 'oStructA' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
    var myStr = retVal[0].oStructA.sString1;


//How can I access the structures.
}

I want to access the structures oStructA and oStructB, Please tell me what the exact syntax should be.


Use str_replace

$str = str_replace(array('\t','\n'),'',$str);

Or preg_replace

$str = preg_replace('/(\\\\n|\\\\t)/', '', $str);
4

7 に答える 7

4

を返すList<object>ので、メンバーを持たないretVal[0]タイプになります。objectoStructA

List匿名タイプのインスタンスを含むを作成しています。タイプが作成された場所の範囲外では、名前でこれらのメンバーにアクセスすることはできません。

リストの名前付きタイプを作成する必要があります。

class MyType
{
    public StructTypeA oStructA { get; set; }
    public StructTypeB oStructB { get; set; }
}

次に、を返すようにメソッドをコーディングしますList<MyType>

このタイプのインスタンスを作成することは、匿名タイプのインスタンスを作成することと同じです。コード例を使用して、newの後にタイプ名を追加するだけです:

var response = new List<object> { new MyType {oStructA = myStructA} , new Mytype {oStructB = myStructB } };

または、タプルを使用して、それらのリストを返すことができます。

または、他の誰かが言ったように、を使用しますdynamic。ただし、一般的にはお勧めしません。名前付きタイプがおそらく最善の方法です。

于 2013-02-06T18:17:39.503 に答える
2

object不要な場合は型と匿名型の使用をやめてください

C# はタイプ セーフな言語です。これは、あなたに起こりうる最高のことです。可能な場合は、型以外の型( など) を使用してくださいTuple<T1, T2>object

public List<Tuple<StructTypeA, StructTypeB>> myFunction()
{
    StructTypeA myStructA = new StructTypeA();
    StructTypeB myStructB = new StructTypeB();

    return new List<Tuple<StructTypeA, StructTypeB>> 
    {
        new Tuple<StructTypeA, StructTypeB>(myStructA, myStructB) 
    };
}

public void myCallerFunction()
{
    var retVal = myFunction();
    var oStructA = retVal[0].Item1;
}
于 2013-02-06T18:14:20.363 に答える
1

あなたがこれをやりたいという実際的な理由は考えられませんが...

public List<dynamic> myFunction ()
{

        StructTypeA myStructA = new StructTypeA();
        StructTypeB myStructB = new StructTypeB();

        var response = new List<dynamic> { new {oStructA = myStructA} , new {oStructB = myStructB } };

            return response;
}

匿名オブジェクトのリストを作成しているので、トリックを行う必要があります。型の使用dynamicが役立つ場合があります。

于 2013-02-06T18:11:44.647 に答える
1

OPは次のよ​​うなことをすると思います:

public class StructTypeA
{
        public string sString1;
        public string sString2;
}
public class StructTypeB
{
        public int iNum1;
        public int iNum2;
}

public static List<object> myFunction ()
{

        StructTypeA myStructA = new StructTypeA();
        StructTypeB myStructB = new StructTypeB();

        var response = new List<object> { myStructA , myStructB };

            return response;
}

public static void Main()
{
    var retVal = myFunction ();

//This does not work, it generates a compile error
// 'object' does not contain a definition for 'oStructA' and no extension method 'oStructA' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

    var myStr1 = ((StructTypeA)retVal[0]).sString1;
    var myStr2 = ((StructTypeB)retVal[1]).iNum1;


//How can I access the structures.
}

明らかに、@Jim Mischel の推奨事項は非常に正しいです。

于 2013-02-06T18:28:39.830 に答える
0

リストのアイテムとして匿名オブジェクトを使用しています。匿名オブジェクトは、単一のメソッドのスコープ内で使用されるように設計されており、他のメソッドには公開されません。そうすることは可能ですが、難しく、多くの問題を引き起こします。

基本的に、あなたがやろうとしているのは、メソッドから 2 つのオブジェクトを返すだけのようです。オブジェクトを 1 つしか返せないという事実に遭遇したので、それを回避しようとしています。あなたの本能は、アイテムをリストに入れ、それを返すことでした。さらに、オブジェクトをリストに入れる前に、無名オブジェクトの中に入れることにしました。より標準的なコーディング規約を使用してこの問題に対処するには、元に戻す必要がありますListそもそも、このコンテキストでa を使用するべきではありません。

これら 2 つのオブジェクトを保持できる型を作成する必要があります。オブジェクトごとに 1 つずつ、合計 2 つのプロパティが必要です。これら 2 つの構造を表す論理的な「型」があれば、必要に応じて独自のものを作成できます。それが本当に意味がなく、このコンテキストで努力する価値がないと思う場合は、既存の汎用ホルダーを使用できますTuple.

public Tuple<StructTypeA, StructTypeB> myFunction()
{
    StructTypeA myStructA = new StructTypeA();
    StructTypeB myStructB = new StructTypeB();

    return Tuple.Create(myStructA , myStructB);
}

Tupleこれで、呼び出し元の観点から、 2 つの項目 (最初の項目は type StructTypeA、2 番目の項目は type ) を持つa が返されていることがわかりますStructTypeB

var returnValues = myFunction();
var myStr = returnValues.Item1.sString1
于 2013-02-06T18:23:55.003 に答える
0

グループ化を設定する方法は、リストではなくタプルです。

StructTypeA myStructA = new StructTypeA();
StructTypeB myStructB = new StructTypeB();

var response = new List<object> { new {oStructA = myStructA} , new {oStructB = myStructB } };

リストは、行の多くの項目です。2 つのアイテムが並んでいます。あなたはこのようにすることができます

List<Object> items = new List<Object>
items.Add(myStructA);
items.Add(myStructB);

両方のアイテムがリストに含まれるようになりました。しかし、持っていることList<Object>常に間違っています。

ただし、次のように、両方のアイテムをタプルに入れることもできます。

Tuple<StuctTypeA, StructTypeB> resultSet = 
     new Tuple<StuctTypeA, StructTypeB>(myStructA, myStructB);

代わりにそれを返すだけです。

于 2013-02-06T18:11:57.930 に答える
-2
var structA = retVal.OfType<StructTypeA>().First();
var myStr = structA.sString1;

含めることを忘れないでください

using System.Linq;
于 2013-02-06T18:11:56.410 に答える