我在第三方设计的设计很差JAR,我需要访问其中一个私有字段.例如,为什么我需要选择私人领域是否有必要?
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
Run Code Online (Sandbox Code Playgroud)
我如何使用反射来获得价值stuffIWant?
我正在用C#,NUnit和Rhino Mocks编写单元测试.以下是我正在测试的类的相关部分:
public class ClassToBeTested
{
private IList<object> insertItems = new List<object>();
public bool OnSave(object entity, object id)
{
var auditable = entity as IAuditable;
if (auditable != null) insertItems.Add(entity);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在调用OnSave后测试insertItems中的值:
[Test]
public void OnSave_Adds_Object_To_InsertItems_Array()
{
Setup();
myClassToBeTested.OnSave(auditableObject, null);
// Check auditableObject has been added to insertItems array
}
Run Code Online (Sandbox Code Playgroud)
这是什么最好的做法?我曾考虑将insertItems作为一个带有公共get的Property添加,或者将List注入ClassToBeTested,但不确定我是否应该修改代码以进行测试.
我已经阅读了许多关于测试私有方法和重构的帖子,但这是一个非常简单的类,我想知道什么是最好的选择.
我遇到了一个问题,我需要访问一个类的私有字段.例如:
class MyClass
{
private string someString;
public MyClass( string someStringValue )
{
someString = someStringValue;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在MyClass之外获取someString的值?
对不起,我不能在这里使用属性,因为实际的生产代码是受保护的.我是一名质量保证/开发人员,我需要一种方法让那些私人用于编写用户验收测试.所以我无法改变生产代码.你能帮我吗?
为什么以下代码不起作用:
class Program
{
static void Main ( string[ ] args )
{
SomeClass s = new SomeClass( );
s.GetType( ).GetField( "id" , System.Reflection.BindingFlags.NonPublic ) // sorry reasently updated to GetField from GetProperty...
.SetValue( s , "new value" );
}
}
class SomeClass
{
object id;
public object Id
{
get
{
return id;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图设置私有字段的值.
这是我得到的例外:
System.NullReferenceException未处理Message = Object引用未设置为对象的实例.来源= ConsoleApplication7
StackTrace:位于C:\ Users\Antonio\Desktop\ConsoleApplication7\ConsoleApplication7\Program.cs中的Program.Main(String [] args):位于System的System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)的第18行. System.Threading.ExecutionContext.Run上的System.Threading.ThreadHelper.ThreadStart_Context(Object state)中的Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()中的AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)(ExecutionContext executionContext System.Threading.ThreadHelper.ThreadStart()中的System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态),ContextExallback回调,对象状态,布尔值ignoreSyncCtx:InnerException:
是否可以获取或设置私有字段?
我想得到System.Guid.c.有没有办法访问它或者我应该从strut复制代码并将字段公开?
我正在尝试设置数据网格中列的宽度.我使用Compact Framework 2.0和C#
我试过这个,但它给了我一个"out of bonds"错误信息:
foreach (DataGridColumnStyle vColumnStyle in dataGrid1.TableStyles[0].GridColumnStyles)
{
vColumnStyle.Width = 100;
}
Run Code Online (Sandbox Code Playgroud)
以下是使用数据表填充数据网格的代码(仅在我尝试设置列宽时失败):
void FillData()
{
// 1
// Open connection
string conString = "Data Source=\\Program Files\\smartdeviceproject2\\repartocrack.sdf";
using (SqlCeConnection c = new SqlCeConnection(conString))
{
c.Open();
// 2
// Create new DataAdapter
using (SqlCeDataAdapter a = new SqlCeDataAdapter(
"SELECT codbultocomp, nombre, estado FROM envios INNER JOIN tiendas ON envios.codigodestino = tiendas.codigodestino", c))
{
// 3
// Use DataAdapter to fill DataTable
DataTable t = new DataTable();
a.Fill(t); …Run Code Online (Sandbox Code Playgroud) 我想得到所有具有空值的字段,但我甚至得到任何字段:
[Serializable()]
public class BaseClass
{
[OnDeserialized()]
internal void OnDeserializedMethod(StreamingContext context)
{
FixNullString(this);
}
public void FixNullString(object type)
{
try
{
var properties = type.GetType().GetFields();
foreach (var property in from property in properties
let oldValue = property.GetValue(type)
where oldValue == null
select property)
{
property.SetValue(type, GetDefaultValue(property));
}
}
catch (Exception)
{
}
}
public object GetDefaultValue(System.Reflection.FieldInfo value)
{
try
{
if (value.FieldType == typeof(string))
return "";
if (value.FieldType == typeof(bool))
return false;
if (value.FieldType == typeof(int))
return 0;
if (value.FieldType …Run Code Online (Sandbox Code Playgroud) 我一直相信他们做到了,但在这里看到一些答案让我怀疑......
我可以通过反射从类外部访问私有字段/属性/方法吗?
我想为实现IDisposable的类编写单元测试.该类有许多私有字段,也实现IDisposable.在我的测试中,我想验证当我调用时Dispose(),它正确调用Dispose()其所有IDisposable字段.基本上,我希望我的单元测试看起来像这样:
var o = new ObjectUnderTest();
o.Dispose();
Assert.IsFalse(ObjectHasUndisposedDisposables(o));
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用反射来实现这一目标.看起来这是一个相当普遍的要求,但我找不到它的任何例子.
有人试过吗?
编辑 - 我不想将Disposables注入被测试的类中.
如此线程中所述,使用Reflection查找私有字段?反射可用于设置私有字段,我已经在使用asp.net 2.0的MOSS 2007中成功完成了.我想知道我的代码是否会在SharePoint 2010中破解,我想这取决于asp.net的支持版本asp.net 3.5是否会允许它.
总结 asp.net 3.5是否允许使用继承类的反射来设置超类的私有成员变量?
任何意见?