考慮以下方案。
一個包含物件的類,在本例中我使用的是OriginObject.
主要問題是屬性 NestedName 必須從 OriginObject 中的另一個屬性訪問有關其行為的說明,在那種情況下我考慮過使用反射,但它變得非常混亂。
問題:
public class OriginObject
{
public NestedObject nestedObject { get; set; }
public Instructions Instruct { get; set; }
public class NestedObject
{
public string NestedName { get; set; }
public void GetName()
{
NestedName = //this.instruct.Name? being "this" the OriginObject;
}
}
public struct Instructions
{
public string Name { get; set; }
}
}
public void GetName()
{
NestedName = GetType().DeclaringType
.GetProperty("instruct")
.GetValue(GetType().DeclaringType)
.GetType()
.GetProperty("Name")
.GetValue(wtf im doing);
}
我知道我可以簡單地添加一個為我提供 Origin 物件的引數,但是,在我的邏輯基礎知識中,這意味著干凈漂亮的代碼:
//Target.DoSomething( );或者
用生產術語來說,它將類似于 Body.Parse( );
有人知道其他方法嗎?不創建順序方法的非法犯罪?
如果這只是一個壞主意,我可以改變它。
uj5u.com熱心網友回復:
我知道這是一些你只是在玩弄的代碼,你并不是真的在考慮用三個類來封裝一個字串……
按原樣使用您的代碼, 的實體OriginObject.NestedObject不會保留對 的實體的參考OriginObject。
如果您希望能夠訪問非公共成員(方法等),那么嵌套您的類是很好的,但是代碼中的所有內容都是公共的,因此沒有任何好處。
由于沒有耦合(OriginObject.NestedObject并且OriginObject.Instructions不訪問任何方法或靜態成員OriginObject),您的代碼相當于沒有嵌套時的代碼。
如果您重寫NestedObject并且Instructions不嵌套,您可能會明白為什么您的代碼將無法作業 - 您將擁有以下等效代碼:
public class OriginObject
{
public NestedObject nestedObject { get; set; }
public Instructions Instruct { get; set; }
}
public class NestedObject
{
public string NestedName { get; set; }
public void GetName()
{
NestedName = // How is NestedObject supposed to get anything from OriginObject?
}
}
public struct Instructions
{
public string Name { get; set; }
}
一種解決方法是將 的實體傳遞OriginObject給 的建構式NestedObject,例如
public class OriginObject
{
public NestedObject Nested { get; set; }
public Instructions Instruct { get; set; }
public class NestedObject
{
private OriginObject _origin;
public NestedObject(OriginObject origin)
{
_origin = origin;
}
public string NestedName
{
get; set;
}
public void GetName()
{
NestedName = _origin.Instruct.Name;
}
}
public struct Instructions
{
public string Name { get; set; }
}
}
然后你會做這樣的事情:
var instructions = new OriginObject.Instructions() { Name = "Test" };
var origin = new OriginObject() { Instruct = instructions };
var nested = new OriginObject.NestedObject(origin);
nested.GetName();
雖然這有點笨拙 - 您必須將 傳遞OriginObject給OriginObject.NestedObject,但您只能使用它來訪問該Instructions屬性。如果您只是將Instructions物件直接傳遞給建構式會更好,例如:
public class OriginObject
{
public NestedObject Nested { get; set; }
public Instructions Instruct { get; set; }
public class NestedObject
{
private Instructions _instructions;
public NestedObject(Instructions instructions)
{
_instructions = instructions;
}
public string NestedName
{
get; set;
}
public void GetName()
{
NestedName = _instructions.Name;
}
}
public struct Instructions
{
public string Name { get; set; }
}
}
你會用這樣的東西:
var instructions = new OriginObject.Instructions() { Name = "Test" };
var origin = new OriginObject() { Instruct = instructions };
var nested = new OriginObject.NestedObject(instructions);
nested.GetName();
現在,有一個GetName()每次都必須呼叫并且不回傳任何內容的方法有點奇怪。更好的辦法可能是擺脫該GetName()方法并讓NestedName屬性成為計算屬性:
public class OriginObject
{
public NestedObject Nested { get; set; }
public Instructions Instruct { get; set; }
public class NestedObject
{
private Instructions _instructions;
public NestedObject(Instructions instructions)
{
_instructions = instructions;
}
public string NestedName
{
get
{
return _instructions.Name;
}
}
}
public struct Instructions
{
public string Name { get; set; }
}
}
然后,您可以使用更簡單的代碼來呼叫它:
var instructions = new OriginObject.Instructions() { Name = "Test" };
var origin = new OriginObject() { Instruct = instructions };
var nested = new OriginObject.NestedObject(instructions);
在這一點上,你可能也有一個建構式OriginObject,所以你知道Instructions和NestedObject實體已設定 - 你可以有這樣的東西:
public class OriginObject
{
public NestedObject Nested { get; set; }
public Instructions Instruct { get; set; }
public OriginObject(NestedObject nested, Instructions instruct)
{
Nested = nested;
Instruct = instruct;
}
public class NestedObject
{
private Instructions _instructions;
public NestedObject(Instructions instructions)
{
_instructions = instructions;
}
public string NestedName
{
get
{
return _instructions.Name;
}
}
}
public struct Instructions
{
public string Name { get; set; }
}
}
您將與這樣的一些代碼使用:
var instructions = new OriginObject.Instructions() { Name = "Test" };
var nested = new OriginObject.NestedObject(instructions);
var origin = new OriginObject(nested, instructions);
請注意,仍然不需要任何嵌套型別:您可以在沒有嵌套的情況下使用此等效代碼:
public class OriginObject
{
public NestedObject Nested { get; set; }
public Instructions Instruct { get; set; }
public OriginObject(NestedObject nested, Instructions instruct)
{
Nested = nested;
Instruct = instruct;
}
}
public class NestedObject
{
private Instructions _instructions;
public NestedObject(Instructions instructions)
{
_instructions = instructions;
}
public string NestedName
{
get
{
return _instructions.Name;
}
}
}
public struct Instructions
{
public string Name { get; set; }
}
這將使用如下代碼呼叫:
var instructions = new Instructions() { Name = "Test" };
var nested = new NestedObject(instructions);
var origin = new OriginObject(nested, instructions);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533350.html
標籤:C#。网系统反射
上一篇:為什么我會收到錯誤“ValueError:引數的型別不受支持”?
下一篇:在C#中查找物件串列的重復項
