各位大佬,求問C#如何根據結構體中的索引號,(索引號對應的是結構體個數),以及使用對應結構體保存的資料。萬分感謝。
uj5u.com熱心網友回復:
各位大佬,求問C#如何根據結構體中的索引號,(索引號對應的是結構體個數),輸出對應結構體保存的資料。萬分感謝。語意不清,重改了一下問題
uj5u.com熱心網友回復:
自己寫個Factory,偷不了的情況就不偷懶了有時候偷不了懶,就是大神也偷不了懶,不然google的protocol buffer,facebook的Grpahml 的net版本就不會是那種別扭的格式了
給你一個另一個大神級別的協議應用自動生成的物件(Avro)
public partial class CatlogItem : ISpecificRecord
{
public static Schema _SCHEMA = Avro.Schema.Parse("{\"type\":\"record\",\"name\":\"CatlogItem\",\"namespace\":\"Smart.protocol\",\"field" +
"s\":[{\"name\":\"CatlogID\",\"type\":\"string\"},{\"name\":\"CatlogName\",\"type\":\"string\"}]}");
private string _CatlogID;
private string _CatlogName;
public virtual Schema Schema
{
get
{
return CatlogItem._SCHEMA;
}
}
public string CatlogID
{
get
{
return this._CatlogID;
}
set
{
this._CatlogID = value;
}
}
public string CatlogName
{
get
{
return this._CatlogName;
}
set
{
this._CatlogName = value;
}
}
public virtual object Get(int fieldPos)
{
switch (fieldPos)
{
case 0: return this.CatlogID;
case 1: return this.CatlogName;
default: throw new AvroRuntimeException("Bad index " + fieldPos + " in Get()");
};
}
public virtual void Put(int fieldPos, object fieldValue)
{
switch (fieldPos)
{
case 0: this.CatlogID = (System.String)fieldValue; break;
case 1: this.CatlogName = (System.String)fieldValue; break;
default: throw new AvroRuntimeException("Bad index " + fieldPos + " in Put()");
};
}
}
看見他對索引的搞法沒有。當然這種東西在Avro,google protocol buffer里都是工具自動生成的,我們并不手動撰寫,當時你也看到了,如果有很簡單的搞法,這些大神級工具也不會搞成這種別扭寫法了
ps:按你的描述,實際上我倒是覺得,你更想做一個Factory 工廠而不是 糾結于索引
uj5u.com熱心網友回復:
如果硬是強行要寫呢,也有辦法。只是稍微別扭點弄個擴展方法,按offset排個序
public static class StructEx
{
public static object GetFiledValueByIndex<T>(this T obj,int index)
where T:struct
{
var lst= obj.GetType().GetFields().OrderBy(p => { return Marshal.OffsetOf<T>(p.Name).ToInt32(); });
if (index >= lst.Count())
{
throw new Exception("索引越界");
}
return lst.ElementAt(index).GetValue(obj);
}
}
uj5u.com熱心網友回復:
大佬,萬分感謝,代碼我懂了一點意思,是個新手看的比較久,請見諒。
您看啊,結構體那部分大致是這么個意思,將結構體內容存入記憶體中,不斷更新。我寫這部分代碼的功能是呼叫結構體的資料,再做下一步動作。據我的想法,將結構體中的某個唯一元素作為參考條件,符合條件,就使用當元素所在的所有資料,來完成我這部分的功能。不知道這么理解對不對.
我怕解釋不清楚,換個說法,結構體中本身就有一個元素,從0-100排序,方便呼叫的,呼叫方自身回圈,從0-100,只不過需要先取出結構體中的元素進行判斷,相等就用,不相等就繼續尋找。
這個問題是想看看是不是有直接用某個元素就可以取得結構體所有資料的方法,確實是懶了。
uj5u.com熱心網友回復:
是的,可是沒有資料的話,就沒有辦法運作
uj5u.com熱心網友回復:
c# 做不到,因為 c# 沒有提供直接訪問記憶體的功能,你需要使用 c++ 來完成uj5u.com熱心網友回復:
不是吧,C#還都一知半解。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/267760.html
標籤:C#
