1

C#/VB.NET を組み込んだ n 層ビジネス アプリケーション プロジェクトがあり、レイヤー間で通信する更新メソッドを取得する際に問題が発生しています。私のデータベースに最も近いデータ層には、データベース内の ID に基づいて従業員を検索し、辞書にその従業員の役職、名など、およびエンティティ全体を配置する GetByID() メソッドがあります (連載)。

次の層 (businessuser) では、プライベート メンバーを、データ層の GetByID() メソッドを呼び出す businessuser GetByID() メソッドの結果に設定しようとしています。プライベートメンバーを設定しようとしているのはここです

_entity = (byte[])retDict["entity"];

_entity は Type であるため、System.Type に byte[] を暗黙的に型指定できないというエラーが表示されます。

VB で行われるプレゼンテーション レイヤーは、リストビューの選択値を介して employeeID を渡します。この値は、ユーザー レイヤーとデータ レイヤーに渡されます。

EmployeeBusinessData レイヤーの GetByID() コードは次のとおりです。

public byte[] GetByID(int empid)
    {
        Dictionary<string, Object> retDict = new Dictionary<string, Object>();

        try
        {
            HelpDeskDBEntities dbContext = new HelpDeskDBEntities();
            dbContext.Configuration.ProxyCreationEnabled = false;
            Employee EmployeeEntity = dbContext.Employees.FirstOrDefault(emp => emp.EmployeeID == empid);

            if (EmployeeEntity != null)
            {
                retDict["title"] = EmployeeEntity.Title;
                retDict["firstname"] = EmployeeEntity.FirstName;
                retDict["lastname"] = EmployeeEntity.LastName;
                retDict["phoneno"] = EmployeeEntity.PhoneNo;
                retDict["email"] = EmployeeEntity.Email;
                retDict["departmentid"] = EmployeeEntity.DepartmentID;
                retDict["employeeid"] = EmployeeEntity.EmployeeID;
                retDict["entity"] = Serializer(EmployeeEntity, true);
            }
            else
            {
                retDict["error"] = "Employee not found!";
            }
        }
        catch (Exception ex)
        {
            ErrorRoutine(ex, "EmployeeBusinessData", "GetByID");
        }
        return Serializer(retDict);
    }

そして EmployeeBusinessUser 層 GetById():

public byte[] GetByID(int empid)
    {
        Dictionary<string, Object> retDict = new Dictionary<string, object>();
        try
        {
            EmployeeBusinessData empData = new EmployeeBusinessData();
            retDict = (Dictionary<string, Object>)Deserializer(empData.GetByID(empid));

            _employeeID = Convert.ToInt32(retDict["employeeid"]);
            _title = Convert.ToString(retDict["title"]);
            _firstName = Convert.ToString(retDict["firstname"]);
            _lastName = Convert.ToString(retDict["lastname"]);
            _phoneNo = Convert.ToString(retDict["phoneno"]);
            _email = Convert.ToString(retDict["email"]);
            _departmentID = Convert.ToInt32(retDict["departmentid"]);
            _entity = (byte[])retDict["entity"];

        }
        catch (Exception ex)
        {
            ErrorRoutine(ex, "EmployeeUserData", "GetByID");
        }
        return Serializer(retDict);
    }

これも Serializer メソッド コードです。両方のクラス .dll で同じです。

public static byte[] Serializer(Object inObject, bool bIsEntity = false)
    {
        byte[] ByteArrayObject;

        if (bIsEntity) //If the entity uses DataContractSerializer
        {
            MemoryStream strm = new MemoryStream();
            var serializer = new DataContractSerializer(inObject.GetType());
            serializer.WriteObject(strm, inObject);
            ByteArrayObject = strm.ToArray();
        }
        else
        {
            BinaryFormatter frm = new BinaryFormatter();
            MemoryStream strm = new MemoryStream();
            frm.Serialize(strm, inObject);
            ByteArrayObject = strm.ToArray();
        }

        return ByteArrayObject;
    }

private Type _entity;

デシリアライザーの 2 つの異なるタイプ:

 public static Object Deserializer(byte[] ByteArrayIn, Type entityType)
    {
        MemoryStream stream = new MemoryStream(ByteArrayIn);
        DataContractSerializer ser = new DataContractSerializer(entityType);
        Object returnObject = ser.ReadObject(stream);
        return returnObject;
    }
public static Object Deserializer(byte[] ByteArrayIn)
    {
        BinaryFormatter frm = new BinaryFormatter();
        MemoryStream strm = new MemoryStream(ByteArrayIn);
        Object returnObject = frm.Deserialize(strm);
        return returnObject;
    }

retDict["entity"] をバイトにキャストして _entity に割り当てるにはどうすればよいですか?

4

1 に答える 1